• scrapy爬虫框架


    一、安装

    #1 pip3 install scrapy(mac,linux)
    #2 windows上(80%能成功,少部分人成功不了)
    	1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs
        3、pip3 install lxml
        4、pip3 install pyopenssl
        5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
        6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
        7、执行pip3 install 下载目录Twisted-17.9.0-cp36-cp36m-win_amd64.whl
        8、pip3 install scrapy
    # 3 就有scrapy命令
    	-D:Python36Scriptsscrapy.exe  用于创建项目
    

    二、框架简介

    执行流程图

    1. 引擎(EGINE)

      引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。有关详细信息,请参见上面的数据流部分。

      (scrapy的核心,用于转发数据或请求,如果是数据,转到管道去保存,如果是请求,转到调度器,如果来的是响应对象,转给爬虫)

    2. 调度器(SCHEDULER)
      用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

      (用于处理要爬取的url的顺序,深度优先/表示一条路走到黑,还是广度优先/表示同一层先爬下来,,去重)

    3. 下载器(DOWLOADER)
      用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

      (向外要爬取的地址发送请求)

    4. 爬虫(SPIDERS)
      SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

    5. 项目管道(ITEM PIPLINES)
      在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

      (需要在settings中配置)

    6. 下载器中间件(Downloader Middlewares)

      位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,你可用该中间件做以下几件事

      1. process a request just before it is sent to the Downloader (i.e. right before Scrapy sends the request to the website);
      2. change received response before passing it to a spider;
      3. send a new Request instead of passing received response to a spider;
      4. pass response to a spider without fetching a web page;
      5. silently drop some requests.
    7. 爬虫中间件(Spider Middlewares)
      位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

    执行顺序:爬虫把要爬的url转发给引擎,引擎再转发给调度器,由调度器决定顺序,返回给引擎,引擎再把要爬取的url通过下载中间件(用于加个头,cookie啥的)向需要爬取的服务端发送请求,响应回来之后也通过下载中间件给引擎,引擎判断是响应数据之后,转发给爬虫,爬虫对数据进行处理,返回一个新的需要爬的地址(就继续上面的流程)或者需要保存的数据,数据部分由引擎转发给管道,保存数据

    目录介绍

        firstscrapy  # 项目名字
            firstscrapy # 包
                -spiders # 所有的爬虫文件放在里面
                    -baidu.py # 一个个的爬虫(以后基本上都在这写东西)
                    -chouti.py
                -middlewares.py # 中间件(爬虫,下载中间件都写在这)
                -pipelines.py   # 持久化相关写在这(items.py中类的对象)
                -main.py        # 自己加的,执行爬虫
                -items.py       # 一个一个的类,
                -settings.py    # 配置文件
            scrapy.cfg          # 上线相关
    

    settings参数介绍

    1 默认情况,scrapy会去遵循爬虫协议
    2 修改配置文件参数,强行爬取,不遵循协议
    	-ROBOTSTXT_OBEY = False
    3 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    4 LOG_LEVEL='ERROR' # 运行的时候就不会把其他日志展示出来
    

    三、基本使用

    1 基本命令

    # 创建项目
    scrapy startproject firstscrapy
    
    # 创建爬虫
    scrapy genspider 爬虫名 爬虫地址
    scrapy genspider chouti dig.chouti.com
    # 一执行就会在spider文件夹下创建出一个py文件
    
    # 运行爬虫
    scrapy crawl chouti   # 带运行日志
    scrapy crawl chouti --nolog  # 不带日志
    
    # 支持右键执行爬虫
    # 在项目路径下新建一个main.py
    from scrapy.cmdline import execute
    execute(['scrapy','crawl','chouti'])
    

    2 数据解析

    #xpath:
        -response.xpath('//a[contains(@class,"link-title")]/text()').extract()  # 取文本
        -response.xpath('//a[contains(@class,"link-title")]/@href').extract()  #取属性
    #css
        -response.css('.link-title::text').extract()  # 取文本
        -response.css('.link-title::attr(href)').extract_first()  # 取属性
    
    

    3 数据持久化

    items.py

    # 持久化匹配的字段
    class ChoutiItem(scrapy.Item):
        # define the fields for your item here like:
        title = scrapy.Field()
        laiyuan = scrapy.Field()
    

    spiders/chouti.py

    import scrapy
    
    
    class ChoutiSpider(scrapy.Spider):
        name = 'chouti'
        allowed_domains = ['dig.chouti.com']
        start_urls = ['http://dig.chouti.com/']
    
        def parse(self, response):
            # 返回要爬取的页面,或者返回要保存的数据
            # 下面两者效果相同
            from pachong.items import ChoutiItem
            item = ChoutiItem()
            div_list = response.css('.link-con .link-item')
            # div_list = response.xpath('//div[contains(@class,"link-item")]')
            for div in div_list:
                title = div.css('.link-title::text').extract_first()
                laiyuan = div.css('.link-from::text').extract_first()
                # title = div.xpath('//a[contains(@class,"link-title")]/text()').extract()
                if not laiyuan:
                    laiyuan = ''
                print(title,laiyuan)
                item['title'] = title
                item['laiyuan'] = laiyuan
                yield item
    

    pipelines.py

    import pymysql
    class PachongPipeline:
        def open_spider(self,spider):
            self.conn = pymysql.connect(host='127.0.0.1', user='root', password="root",
                     database='pachong', port=3306)
    
        def process_item(self, item, spider):
            cursor = self.conn.cursor()
            sql = 'insert into chouti (title,laiyuan)values(%s,%s)'
            cursor.execute(sql,[item['title'],item['laiyuan']])
            self.conn.commit()
            return item
    
        def close_spider(self,spider):
            self.conn.close()
    

    settings.py

    ITEM_PIPELINES = {
       'pachong.pipelines.PachongPipeline': 300,
    }
    # 配置优先级
    
  • 相关阅读:
    css布局
    css笔记
    css笔记
    css笔记
    HttpServletResponse简单理解
    SpringCloud Zuul网关的简单理解
    SpringCloud Zuul网关超时
    notepad++实用技巧
    Json常用代码
    含有Date属性的对象转化为Json
  • 原文地址:https://www.cnblogs.com/hz2lxt/p/13444529.html
Copyright © 2020-2023  润新知