爬虫 scrapy架构介绍和实战

内容详细

1 scrapy架构和目录介绍

        # pip3 install scrapy
        # 创建项目:scrapy startproject cnblogs_spider   等同于django创建项目
        # 创建爬虫:scrapy genspider cnblogs www.cnblogs.com   等同于创建app
            -本质就是在spiders文件夹下创建一个py文件,写入一些代码
        # 运行爬虫:scrapy crawl 爬虫名

1.1 项目目录介绍

        cnblogs_spider   # 项目名字
            -cnblogs_spider # 文件夹
            -spiders      # 文件夹,下面放了一个个爬虫文件
                -cnblogs.py  # 一个个的爬虫文件
            items.py       # 模型类写了一些字段---》类似于django的models
            middlewares.py # 中间件:爬虫中间件和下载中间件
            pipelines.py   # 管道:存储数据的代码写在这
            settings.py    # 项目的配置文件
          scrapy.cfg       # 项目上线需要用到,不用管



        # 重点:咱们以后主要是在cnblogs.py爬虫文件中写爬取和解析的逻辑,pipelines写存储

1.2 scrapy架构

        # 引擎(EGINE)-->大总管,负责全部的数据流向--》内置的,咱们不需要写

        引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。

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

        # 下载器(DOWLOADER)--》真正负责下载---》高效的异步模型
        用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的

        # 爬虫(SPIDERS)--》咱们重点写的地方,解析响应,从响应中提取要保存的数据和下一次爬取的地址
        SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求

        # 项目管道(ITEM PIPLINES)---》存储数据的逻辑---》可以存到文件,redis,mysql。。。
        在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

        # 下载器中间件(Downloader Middlewares)--》用的多
        位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request(加请求头,加cookie,加代理),已经从DOWNLOADER传到EGINE的响应response进行一些处理

        # 爬虫中间件(Spider Middlewares)---》用的少
        位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

img

1.3 py文件直接运行爬虫

        # 右键运行它就可以运行爬虫,不需要每次都敲命令

        from scrapy import cmdline

        # cmdline.execute(['scrapy', 'crawl' ,'cnblogs','--nolog'])
        cmdline.execute(['scrapy', 'crawl' ,'cnblogs'])

2 scrapy解析数据

        ###################################  重点
        1 response对象有css方法和xpath方法
            -css中写css选择器
          -xpath中写xpath选择
        2 重点1:
            -xpath取文本内容
                './/a[contains(@class,"link-title")]/text()'
           -xpath取属性
            './/a[contains(@class,"link-title")]/@href'
           -css取文本
            'a.link-title::text'
           -css取属性
            'img.image-scale::attr(src)'
        3 重点2:
            .extract_first()  取一个
          .extract()       取所有

3 setting中相关配置

3.1 基本配置


        # 两套配置,内置一套,用户一套


        ROBOTSTXT_OBEY = False  # 是否遵循爬虫协议,如果写了它,一般网站都不让爬,基本写成false
        USER_AGENT = '浏览器头' # 爬虫请求头中USER_AGENT是什么,做成浏览器的样子
        LOG_LEVEL='ERROR'  # 日志级别改成ERROR,以后错误日志会打印,普通日志不打印
        #---------#####-------
        SPIDER_MIDDLEWARES=[]      # 爬虫中间件,可以写多个
        DOWNLOADER_MIDDLEWARES=[]  # 下载中间件类,配置在这,可以配多个
        ITEM_PIPELINES=[]          # 保存数据,会执行到的类,类内部写保存逻辑

3.2 提高爬虫效率

        #1 增加并发:
        默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。
        #2 降低日志级别:
        在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = 'INFO'

        # 3 禁止cookie:
        如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False
        # 4 禁止重试:
        对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False
        # 5 减少下载超时:
        如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s

4 全站爬取cnblgos文章

        # 只爬了首页---》下一页,文章详情页没有爬取
        # 文章--》文章对象(标题,作者,摘要,详情。。。)---》把整站都爬取完成

4.1 request和response对象传递参数

        # 在request中通过meta传递
           yield Request(url=article_url,callback=self.parse_detail,meta={'item':item})
        # 在response中通过meta取出
            item=response.meta.get('item')

4.2 解析出下一页地址并继续爬取

        # 使用
        yield Request(url=article_url,callback=self.parse_detail,meta={'item':item})
        yield Request(url=next_url)

5 存储数据


        # 关于mysql出现Data too long for column的解决方案   打开my.ini,将其中sql-mode节中的STRICT_TRANS_TABLES这个属性去掉;


6 爬虫中间件和下载中间件

        1 爬虫和下载中间件要使用,需要在配置文件中
        SPIDER_MIDDLEWARES = {
          'crawl_cnblogs.middlewares.CrawlCnblogsSpiderMiddleware': 5,
        }
        DOWNLOADER_MIDDLEWARES = {
          'crawl_cnblogs.middlewares.CrawlCnblogsDownloaderMiddleware': 5,
        }

7 加代理,加header,集成selenium

        0 在下载中间件的process_reqeust方法中
        1 加cookie
            # request.cookies['name']='lqz'
            # request.cookies= {}
        2 修改header
              # request.headers['Auth']='asdfasdfasdfasdf'
              # request.headers['USER-AGENT']='ssss'
        3 加代理
              request.meta['proxy']='http://103.130.172.34:8080'


        4 fake_useragent模块,可以随机生成user-aget
                from fake_useragent import UserAgent
                ua = UserAgent()
                print(ua.ie)   #随机打印ie浏览器任意版本
                print(ua.firefox) #随机打印firefox浏览器任意版本
                print(ua.chrome)  #随机打印chrome浏览器任意版本
                print(ua.random)  #随机打印任意厂家的浏览器 

posted @ 2022-05-22 23:02  风花雪月*  阅读(49)  评论(0编辑  收藏  举报