Scrapy的日志等级和请求传参
2019-01-16 05:50:08来源:博客园 阅读 ()
日志等级
日志信息: 使用命令: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
原文链接:https://www.cnblogs.com/zycorn/p/10272313.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 使用scrapy框架爬取全书网书籍信息。 2019-08-13
- 封装查找元素以及集成日志输出,Base模块 2019-07-24
- scrapy学习笔记(二)框架结构工作原理 2019-07-24
- python 之 logger日志 字典配置文件 2019-07-24
- 如何为Python日志输出着色? 2019-06-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash