一、Scrapy的日志等级

  在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息。

1、日志等级(信息种类)

  • ERROR:错误
  • WARNING:警告
  • INFO:一般信息
  • DEBUG:调试信息(默认)

2、设置日志信息指定输出

  在settings.py配置文件中任意位置加入:

# 设置终端输出指定种类的日志信息
LOG_LEVEL = 'ERROR' # 只打印ERROR级别的日志信息

  将日志信息存储在指定文件中,而不再显示在终端里:

# 设置终端输出指定种类的日志信息
LOG_LEVEL = 'ERROR' # 只打印ERROR级别的日志信息
LOG_FILE = 'log.txt' # 指定日志存储到一个文件中

二、请求传参

  请求传参针对场景:爬取的数据值不在同一个页面中。

  需求:将id97电影网站中电影详情数据进行爬取(名称、类型、导演、语言、片长)

1、问题:如何将两个方法解析的电影详情数据存储到一个item对象中

  meta参数可实现item对象的传递。scrapy.Request()方法中有一个参数meta.通过meta可以将items对象传递给回调函数。

  注意:meta只能接收字典类型的数据值。因此需要将items封装到字典中,将字典赋值给meta参数,meta就可以将字典传递给回调函数。

def parse(self, response):
div_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div') # 获取/html/body/div[1]/div[1]/div[2]下所有子div
for div in div_list:
"""省略代码""" # 创建items对象
item = MovieproItem()
item['name'] = name
item['kind'] = kind
# 手动发起请求
yield scrapy.Request(url=url, callback=self.parseBySecondPage, meta={'item': item})

  随后可以在parseBySecondPage函数中取出Request方法的meta参数传递过来的字典。

  取出方法是response.meta,如下所示:

def parseBySecondPage(self, response):
"""专门用于解析二级子页面中的数据值""" # 取出Request方法的meta参数传递过来的字典:取出方法是response.meta
item = response.meta['item']
item['actor'] = actor
item['language'] = language
item['longTime'] = longTime

2、爬虫文件movie.py编写如下

import scrapy
from moviePro.items import MovieproItem class MovieSpider(scrapy.Spider):
name = 'movie'
# allowed_domains = ['www.id97.com']
start_urls = ['https://www.55xia.com/movie'] # 网站地址更改。。 def parseBySecondPage(self, response):
"""专门用于解析二级子页面中的数据值"""
# 导演、语言、片长
actor = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[1]/td[2]/a/text()').extract_first()
language = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[6]/td[1]/text()').extract_first()
longTime = response.xpath('/html/body/div[1]/div/div/div[1]/div[1]/div[2]/table/tbody/tr[8]/td[2]/text()').extract_first() # 取出Request方法的meta参数传递过来的字典:取出方法是response.meta
item = response.meta['item']
item['actor'] = actor
item['language'] = language
item['longTime'] = longTime # 将item提交给管道
yield item def parse(self, response):
# 名称、类型、导演、语言、片长
div_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div') # 获取/html/body/div[1]/div[1]/div[2]下所有子div
for div in div_list:
# 电影名称
name = div.xpath('.//div[@class="meta"]/h1/a/text()').extract_first() # 电影种类: //text() 该div下所有文本数据均获取
# 如下xpath方法返回的是一个列表,且列表长度为4
kind = div.xpath('.//div[@class="otherinfo"]//text()').extract()
# 将kind列表转化为字符串
kind = "".join(kind) # 影片详情url
url = div.xpath('.//div[@class="meta"]/h1/a/@href').extract_first() # 创建items对象
item = MovieproItem()
item['name'] = name
item['kind'] = kind
# 问题:如何将两个方法解析的电影详情数据存储到一个item对象中——meta # 下一步:对url发起请求,获取页面数据,进行指定数据解析
# 手动发起请求
yield scrapy.Request(url=url, callback=self.parseBySecondPage, meta={'item': item})

3、其他文件配置

(1)items.py文件封装所有属性

import scrapy

class MovieproItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 封装所有属性
name = scrapy.Field()
kind = scrapy.Field()
actor = scrapy.Field()
language = scrapy.Field()
longTime = scrapy.Field()

(2)管道文件pipeline.py

import json

class MovieproPipeline(object):
fp = None
def open_spider(self, spider):
self.fp = open('movie.txt', 'w', encoding='utf-8') def process_item(self, item, spider):
# detail = item['name'] + ':' + item['kind'] + ':' + item['actor'] + ':' + item['language'] + ':' + item['longTile'] + '\n\n\n'
detail = dict(item)
json.dump(detail, self.fp, ensure_ascii=False)
return item def close_spider(self, spider ):
self.fp.close()

(3)settings.py配置文件

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' # 伪装请求载体身份 # Obey robots.txt rules
ROBOTSTXT_OBEY = False # 不遵从门户网站robots协议,避免某些信息爬取不到 # Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'moviePro.pipelines.MovieproPipeline': 300,
}

3、特别处理

(1)kind(电影种类)特别处理:

kind = div.xpath('.//div[@class="otherinfo"]//text()').extract()
# 将kind列表转化为字符串
kind = "".join(kind)

  解析它的xpath方法返回的是一个列表,且列表长度为4。因此不能再使用extract_first方法,要使用extract()方法获取列表。

  获取列表后需要将列表转化为字符串。在这里使用"".join(list)实现。

(2)在管道文件中完成数据持久化

# 方法一:拼接字符串写入文件中
def process_item(self, item, spider):
detail = item['name'] + ':' + item['kind'] + ':' + item['actor'] + ':' + item['language'] + ':' + item['longTile'] + '\n\n\n'
self.fp.write(detail)
return item # 方法二:json.dump()将dict类型的数据转成str,并写入到json文件中
def process_item(self, item, spider):
detail = dict(item)
json.dump(detail, self.fp, ensure_ascii=False)
return item

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. 爬虫开发10.scrapy框架之日志等级和请求传参

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

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

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

  7. 12 Scrapy框架的日志等级和请求传参

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

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

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

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

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

随机推荐

  1. time、random以及序列化模块

    一. time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type( ...

  2. CentOS7.3托管磁盘虚拟机扩容数据磁盘

    随着托管磁盘的上线,虚拟机支持的单块磁盘容量从1TB到达了4TB,客户对单块磁盘容量的需求量也会变的很大. 操作之前需要重点查看: 由于扩容磁盘的操作非同小可,一旦哪一步出现问题,就会导致分区损坏,数 ...

  3. 解决vs code中golang插件依赖安装失败问题

    解决vs code中golang插件依赖安装失败问题 Installing github.com/nsf/gocode SUCCEEDED Installing github.com/uudashr/ ...

  4. js 事件的阶段

    事件有三个阶段: 1.事件捕获阶段 :从外向内 2.事件目标阶段 :最开始选择的那个 3.事件冒泡阶段 : 从里向外   为元素绑定事件 addEventListener("没有on的事件类 ...

  5. win7/win8/win10 系统

    WIN7/WIN8/WIN10 系统安装 http://www.windows7en.com/Win7/18572.html

  6. <!-- -->是HTML的注释标签js,css注释

    <!-- -->是HTML的注释标签 js,css:单行注释以 // 开头. 多行注释以 /* 开始,以 */ 结尾. web大作业(Vip视频解析) <!-- 这个网页是vip视频 ...

  7. A Simple Math Problem(矩阵快速幂)----------------------蓝桥备战系列

    Lele now is thinking about a simple function f(x).  If x < 10 f(x) = x.  If x >= 10 f(x) = a0 ...

  8. VUE 入门教程

    http://www.runoob.com/w3cnote/vue-js-quickstart.html VUE安装教程 https://segmentfault.com/a/119000001218 ...

  9. docker 部署disconf 以及将其做成镜像

    1.需要一台服务器(阿里云,腾讯云.实体服务器都行,本次是以实体服务器为依照做的) 2.安装docker   https://www.cnblogs.com/shijunjie/p/10436293. ...

  10. 行业UI设计师总结UI设计8个趋势

    纵观整个设计的历史可以发现,设计的历史演变都无一例外都是从复杂的装饰性设计逐步的演化为更加注重功能性的简洁化设计.并且设计师们还在不停的试图通过各种设计语言的创新追求极至设计的可能性.设计潮流变更的核 ...