一、Scrapy的日志等级

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

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

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

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

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

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

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

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

二、请求传参

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

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

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

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

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

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

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

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

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

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

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

3、其他文件配置

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

  1. import scrapy
  2. class MovieproItem(scrapy.Item):
  3. # define the fields for your item here like:
  4. # name = scrapy.Field()
  5. # 封装所有属性
  6. name = scrapy.Field()
  7. kind = scrapy.Field()
  8. actor = scrapy.Field()
  9. language = scrapy.Field()
  10. longTime = scrapy.Field()

(2)管道文件pipeline.py

  1. import json
  2. class MovieproPipeline(object):
  3. fp = None
  4. def open_spider(self, spider):
  5. self.fp = open('movie.txt', 'w', encoding='utf-8')
  6. def process_item(self, item, spider):
  7. # detail = item['name'] + ':' + item['kind'] + ':' + item['actor'] + ':' + item['language'] + ':' + item['longTile'] + '\n\n\n'
  8. detail = dict(item)
  9. json.dump(detail, self.fp, ensure_ascii=False)
  10. return item
  11. def close_spider(self, spider ):
  12. self.fp.close()

(3)settings.py配置文件

  1. # Crawl responsibly by identifying yourself (and your website) on the user-agent
  2. 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' # 伪装请求载体身份
  3. # Obey robots.txt rules
  4. ROBOTSTXT_OBEY = False # 不遵从门户网站robots协议,避免某些信息爬取不到
  5. # Configure item pipelines
  6. # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
  7. ITEM_PIPELINES = {
  8. 'moviePro.pipelines.MovieproPipeline': 300,
  9. }

3、特别处理

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

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

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

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

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

  1. # 方法一:拼接字符串写入文件中
  2. def process_item(self, item, spider):
  3. detail = item['name'] + ':' + item['kind'] + ':' + item['actor'] + ':' + item['language'] + ':' + item['longTile'] + '\n\n\n'
  4. self.fp.write(detail)
  5. return item
  6. # 方法二:json.dump()将dict类型的数据转成str,并写入到json文件中
  7. def process_item(self, item, spider):
  8. detail = dict(item)
  9. json.dump(detail, self.fp, ensure_ascii=False)
  10. 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. HTML5 indexedDb 数据库

    indexedDb 数据库   上一节中,我们知道了,HMTL5中内置了两种本地数据库,一种是通过SQL语言来访问的文件型SQL数据库被称为“SQLLite,另一种是是被称为indexedDB 的数据 ...

  2. [DEBUG]-[org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:431)] 一直在创建sqlsession工厂原因

    今天在做开发项目的时候出现一直在控台输出创建sqlsessionfactory'这个代码, tomcat一直在控制台上输出这个内容无法停止下来,那么到底是什么原因呢, 我们可以在输出信息上看到有个wa ...

  3. php-fpm 三种运行模式

    php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的: slowlog = /usr/local/var/log/php-fpm.log.slowrequest_slowlog_t ...

  4. 【算法笔记】B1029 旧键盘

    1029 旧键盘 (20 分) 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在 2 ...

  5. 去掉小程序button元素的边框

    button::after {     display:none }

  6. npm install时 报错Maximum call stack size exceeded

    给npm降级或者升级 降级 : npm install -g npm@5.4.0 升级 : npm install -g npm  升级到最新版

  7. 原生js操作类名

  8. ESP8266使用详解

    [From] http://www.cnblogs.com/yangfengwu/p/5205570.html 用的这款 各引脚功能:来至厂家提供的资料 GPIO0 默认是工作模式(不接线).如果接了 ...

  9. Python学习 day03

    一.基本数据类型 python中的基本数据类型有以下几种: int   --  整数     python3中默认整数都是int型,python2中int的范围为-231~232-1(32位系统中)/ ...

  10. Maven系统学习

    1. 1.1 何为构建? 编译.测试.运行.打包.部署等工作: Maven就是用软件的办法让这一系列工作自动化,只需要一条简单的命令,所有繁琐的工作就会自动完成: Maven最大的消除了构建的重复,抽 ...