1.回顾上篇
1.请求传参(item):
- 应用场景:解析的数据不在同一张页面中
- Request(callback,meta={})
2.LOG_LEVEL LOG_FILE
3.下载中间件:
- 批量拦截请求(代理ip和UA)和响应(处理页面数据)
4.如何在scrapy使用selenium
1.在spider的init方法中实例化一个浏览器对象
2.在spider的closed方法中关闭浏览器对象
3.在下载中间件类的process_response方法中接收spider中的浏览器对象
4.处理执行相关自动化操作(发起请求,获取页面数据)
5.实例化一个新的响应对象(from scrapy.http import HtmlResponse),且将页面数据存储到该对象中
6.返回新的响应对象
7.在配置文件中开启中间件
5.如何提升scrapy爬取数据的效率:
增加并发:
默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。
降低日志级别:
在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘INFO’
禁止cookie:
如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False
禁止重试:
对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False
减少下载超时:
如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s
提升scrapy爬取数据的效率
# 创建spider爬虫文件命令
scrapy genspider -t crawl filename url
1 # -*- coding: utf-8 -*-
2 import scrapy
3 from scrapy.linkextractors import LinkExtractor
4 from scrapy.spiders import CrawlSpider, Rule
5
6
7 class ChoutiSpider(CrawlSpider):
8 # name = 'chouti'
9 # # allowed_domains = ['www.xxx.com']
10 # start_urls = ['https://dig.chouti.com/r/scoff/hot/1']
11 # # 连接提取器
12 # # allow表示的就是连接提取器提取连接的规则(正则)
13 # link = LinkExtractor(allow=r'/r/scoff/hot/d+')
14 #
15 # rules = (
16 # # 规则解析器:将连接提取器提取到的连接所对应的页面数据进行指定形式的解析
17 # Rule(link, callback='parse_item', follow=True),
18 # # 让连接提取器继续作用到连接提取器提取到的连接所对应的页面中
19 # )
20 #
21 # def parse_item(self, response):
22 # print(response)
23
24 name = 'qiushi'
25 # allowed_domains = ['www.xxx.com']
26 start_urls = ['https://www.qiushibaike.com/pic/']
27 # 连接提取器
28 # allow表示的就是连接提取器提取连接的规则(正则)
29 link = LinkExtractor(allow=r'/pic/page/d+?s=d+')
30 link1 = LinkExtractor(allow=r'/pic/$')
31 rules = (
32 # 规则解析器:将连接提取器提取到的连接所对应的页面数据进行指定形式的解析
33 Rule(link, callback='parse_item', follow=True),
34 # 让连接提取器继续作用到连接提取器提取到的连接所对应的页面中
35 Rule(link1, callback='parse_item', follow=True),
36 )
37
38 def parse_item(self, response):
39 print(response)