日志等级

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

- 日志信息的种类:

  - ERROR:一般错误;

  - WARNING:警告;

  - INFO:一般的信息;

  - DEBUG: 调试信息;

- 设置日志信息指定输出:

  - 在settings配置文件中添加:

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

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

请求传参

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

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

scrapy.Request()

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

  - 爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from moviePro.items import MovieproItem class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['www.id97.com']
start_urls = ['http://www.id97.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()
 

  - 管道文件:

# -*- 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()

提高scrapy的爬取效率

- 增加并发量:

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

    CONCURRENT_REQUESTS = 100

    - 将并发改为100

- 降低日志等级:

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

    LOG_LEVEL = 'INFO'

- 禁止cookie:

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

    COOKIES_ENABLED = False

- 禁止重试:

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

    RETRY_ENABLED = False

- 减少下载超时:

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

    DOWNLOAD_TIMEOUT = 10 

- 测试案例:

# -*- coding: utf- -*-
import scrapy
from ..items import PicproItem
# 提升spider的爬取效率测试
# 爬取4k高清壁纸网站的图片 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(,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
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

配置文件:

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': ,
} # 打印具体错误信息
LOG_LEVEL ="ERROR" #提升爬取效率 CONCURRENT_REQUESTS =
COOKIES_ENABLED = False
RETRY_ENABLED = False
DOWNLOAD_TIMEOUT =

Scrapy日志等级以及请求传参的更多相关文章

  1. scrapy框架的日志等级和请求传参, 优化效率

    目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使 ...

  2. 13.scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...

  3. scrapy框架的日志等级和请求传参

    日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息 ...

  4. scrapy框架之日志等级和请求传参-cookie-代理

    一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 ...

  5. Scrapy的日志等级和请求传参

    日志等级 日志信息:   使用命令:scrapy crawl 爬虫文件 运行程序时,在终端输出的就是日志信息: 日志信息的种类: ERROR:一般错误: WARNING:警告: INFO:一般的信息: ...

  6. 爬虫开发10.scrapy框架之日志等级和请求传参

    今日概要 日志等级 请求传参 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志 ...

  7. scrapy框架post请求发送,五大核心组件,日志等级,请求传参

    一.post请求发送 - 问题:爬虫文件的代码中,我们从来没有手动的对start_urls列表中存储的起始url进行过请求的发送,但是起始url的确是进行了请求的发送,那这是如何实现的呢? - 解答: ...

  8. Scrapy框架之日志等级和请求传参

    一.Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 1.日志等级(信息种类) ERROR:错误 WARN ...

  9. 13,scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...

随机推荐

  1. SQL Server对数据进行修改

    SQL Server对数据进行修改,修改数据库中的数据. auto"> <tr style="background:red"> <td>编号 ...

  2. vue-属性传值 props

    props属性传值 1.传具体的值  string(字符串) number(数值) boolean(布尔) 2.传一个引用 array(数组)  object(对象) ----传引用----- 代码 ...

  3. call,apply,bind

    1.IE5之前不支持call和apply,bind是ES5出来的;2.call和apply可以调用函数,改变this,实现继承和借用别的对象的方法; 1 call和apply定义 调用方法,用一个对象 ...

  4. Python基础--Redis基础

    字符串: setnx: 若没有则设置 setex: setex key exit_time value [设置其删除时间] setrange: setrange key index replace_v ...

  5. 调用的方法里接收一个List<>类型的参数,里面是自定义的EC类, 我要通过反射构建这List对象

              public static object CreateGeneric(Type generic, Type innerType, params object[] args)     ...

  6. springMVC知识点复习

    @ResponseBody和@RequestBody的使用 <html> <script type="text/javascript" src="rel ...

  7. 嵌入式linux实现NAT端口映射

    场景: 1.嵌入式linux系统内已经在2个网卡,分别为eth0(内网物理网卡,ip地址:192.168.1.4)以及ppp1(VPN客户端通过PPTP协议拨号生成的虚拟网卡,ip地址:192.168 ...

  8. 纪录:Solr6.4.2+Flume1.7.0 +morphline+kafka集成

    当前大多数企业版hadoop的solr版本都还停留在solr4.x,由于这个版本的solr本身的bug较多,使用起来会出很多奇怪的问题.如部分更新日期字段失败的问题. 最新的solr版本不仅修复了以前 ...

  9. [bzoj2124]等差子序列_线段树_hash

    等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...

  10. php抓取网页

    用php抓取页面的内容在实际的开发其中是很实用的,如作一个简单的内容採集器,提取网页中的部分内容等等.抓取到的内容在通过正則表達式做一下过滤就得到了你想要的内容.下面就是几种经常使用的用php抓取网页 ...