Scrapy中间件
scrapy的框架图
- spiders组件:爬虫组件,负责从response中提取数据,还负责url(request)发送
- scrapy engine:引擎负责各个组件的通信
- 下载器:引擎发送过来的request进行下载,之后交给spider
- scheduler:调度器,主要负责request入队和出队
- 下载中间件
进入的数据:从调度器出来的request
出来的数据:request,但是这个request马上要被下载器下载了
请求在下载之前,我们可以使用下载中间件进行处理
处理请求的方法有:- 使用selenium下载
- 设置请求头‘
- 设置代理
如何设置中间件
(一)步骤
- 新建一个py文件
- 在文件新建一个类,这个必须有一个方法:process_request(),在process_request方法中进行对请求的处理
- 在settings.py 中配置下载中间件
(二)自定义下载(设置selenium下载)
- dirver不能放到init方法中。
当这个网站必须用selenium,就建议不考虑使用scrapy。
但是使用selniunm请求次数比较有限,可以考虑使用selenium - return None: continue processing this request --继续到下载器
return a Response object–自定义下载–HtmlResponse
return a Request object–设置代理
raise IgnoreRequest: process_exception() methods of—过滤request
body:响应正文
参考代码(不要手动敲,复制中间件相应代码改写):
from selenium import webdriver
from scrapy.http import HtmlResponse
class SeleniumDownloadMiddle(object):
"""自定义下载类"""
def process_request(self, request, spider):
"""
下载中间件处理requests方法
:param request:
:param spider:
:return:
"""
# 判断是否使用selenium请求
ajax_flag = request.meta.get('ajax_flag')
# ajax_flag = request.meta['ajax_flag']
if not ajax_flag:
# driver不能放到init方法中。
# 当这个网站必须用selenium,就建议不考虑使用scrapy
# 但是使用selenium请求次数比较有限,可以考虑使用selenium
driver = webdriver.Chrome()
driver.get(request.url)
driver.implicitly_wait(20)
html_str = driver.page_source
# Must either:
# - return None: continue processing this request 继续到下载器