• Scrapy的日志等级和请求传参


    日志等级

    日志信息:   使用命令:scrapy crawl 爬虫文件 运行程序时,在终端输出的就是日志信息;

    日志信息的种类:

    •   ERROR:一般错误;
    •   WARNING:警告;
    •   INFO:一般的信息;
    •   DEBUG: 调试信息;

    设置日志信息指定输出:

      在settings配置文件中添加:

        LOG_LEVEL = ‘指定日志信息种类’即可。

        LOG_FILE = 'log.txt'则表示将日志信息写入到指定文件中进行存储。

    请求传参

      在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中。这时我们就需要用到请求传参。

    通过 在scrapy.Request()中添加 meta参数 进行传参;

    scrapy.Request()

    案例展示爬取www.55xia.com电影网,将一级页面中的电影名称,类型,评分一级二级页面中的上映时间,导演,片长进行爬取。

    爬虫程序

    # -*- coding: utf-8 -*-
    import scrapy
    from moviePro.items import MovieproItem
    
    class MovieSpider(scrapy.Spider):
        name = 'movie'
        allowed_domains = ['www.55xia.com']
        start_urls = ['http://www.55xia.com/']
    
        def parse(self, response):
            div_list = response.xpath('//div[@class="col-xs-1-5 movie-item"]')
    
            for div in div_list:
                item = MovieproItem()
                item['name'] = div.xpath('.//h1/a/text()').extract_first()
                item['score'] = div.xpath('.//h1/em/text()').extract_first()
    
                #xpath(string(.))表示提取当前节点下所有子节点中的数据值(.)表示当前节点
                item['kind'] = div.xpath('.//div[@class="otherinfo"]').xpath('string(.)').extract_first()
                item['detail_url'] = div.xpath('./div/a/@href').extract_first()
    
                #请求二级详情页面,解析二级页面中的相应内容,通过meta参数进行Request的数据传递
                yield scrapy.Request(url=item['detail_url'],callback=self.parse_detail,meta={'item':item})
    
        def parse_detail(self,response):
            #通过response获取item
            item = response.meta['item']
    
            item['actor'] = response.xpath('//div[@class="row"]//table/tr[1]/a/text()').extract_first()
            item['time'] = response.xpath('//div[@class="row"]//table/tr[7]/td[2]/text()').extract_first()
            item['long'] = response.xpath('//div[@class="row"]//table/tr[8]/td[2]/text()').extract_first()
    
            #提交item到管道
            yield item

    items

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class MovieproItem(scrapy.Item):
        # define the fields for your item here like:
        name = scrapy.Field()
        score = scrapy.Field()
        time = scrapy.Field()
        long = scrapy.Field()
        actor = scrapy.Field()
        kind = scrapy.Field()
        detail_url = scrapy.Field()

    pipelines

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import json
    class MovieproPipeline(object):
        def __init__(self):
            self.fp = open('data.txt','w')
        def process_item(self, item, spider):
            dic = dict(item)
            print(dic)
            json.dump(dic,self.fp,ensure_ascii=False)
            return item
        def close_spider(self,spider):
            self.fp.close()

    提高爬取效率

      爬取数据的过程中可能会遇到很多条数据,导致爬取效率变低,修改settings文件中的配置就能提高爬取效率.

    1.增加并发量:

      默认最大的并发量为32,可以通过设置settings文件修改

    CONCURRENT_REQUESTS = 100

      将并发改为100

    2.降低日志等级:

      在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。修改settings.py

    LOG_LEVEL = 'INFO'

    3.禁止cookie:

      如果不是真的需要cookie,则在scrapy爬取数据时可以进制cookie从而减少CPU的使用率,提升爬取效率。修改settings.py

    COOKIES_ENABLED = False

    4.禁止重试:

      对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。修改settings.py

    RETRY_ENABLED = False

    5.减少下载超时:

      如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。修改settings.py

    DOWNLOAD_TIMEOUT = 10 

    小试牛刀

    爬取4k高清壁纸网站的图片并且提高爬取效率

    爬虫程序

    # -*- coding: utf-8 -*-
    import scrapy
    from ..items import PicproItem
    
    
    class PicSpider(scrapy.Spider):
        name = 'pic'
        # allowed_domains = ['www.pic.com']
        start_urls = ['http://pic.netbian.com/']
    
        def parse(self, response):
            li_list = response.xpath('//div[@class="slist"]/ul/li')
            print(li_list)
            for li in li_list:
                img_url ="http://pic.netbian.com/"+li.xpath('./a/span/img/@src').extract_first()
                # print(66,img_url)
                title = li.xpath('./a/span/img/@alt').extract_first()
                print("title:", title)
                item = PicproItem()
                item["name"] = title
    
                yield scrapy.Request(url=img_url, callback =self.getImgData,meta={"item":item})
    
    
        def getImgData(self, response):
            item = response.meta['item']
            # 取二进制数据在body中
            item['img_data'] = response.body
    
            yield item

    pipelines

    import os
    class PicproPipeline(object):
        def open_spider(self,spider):
            if not os.path.exists('picLib'):
                os.mkdir('./picLib')
        def process_item(self, item, spider):
            imgPath = './picLib/'+item['name']+".jpg"
            with open(imgPath,'wb') as fp:
                fp.write(item['img_data'])
                print(imgPath+'下载成功!')
            return item

    settings

    USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    ITEM_PIPELINES = {
       'picPro.pipelines.PicproPipeline': 300,
    }
    
    
    # 打印具体错误信息
    LOG_LEVEL ="ERROR"
    
    #提升爬取效率
    
    CONCURRENT_REQUESTS = 10
    COOKIES_ENABLED = False
    RETRY_ENABLED = False
    DOWNLOAD_TIMEOUT = 5
  • 相关阅读:
    Vmware安装CentOs7+gitlab(一)
    设计模式(一) 动态代理初尝试
    APP 技术支持
    App隐私条款
    Mac OS X中开启或关闭显示隐藏文件命令
    软件工程学习要点
    如何实现企业信息化
    记录一些flutter学习网址
    基于深度学习的语义分割
    对自动变速器的控制器建模
  • 原文地址:https://www.cnblogs.com/zycorn/p/10272313.html
Copyright © 2020-2023  润新知