Python Scrapy下载中间件的编写与配置详解
本文详解Scrapy框架中下载中间件的编写方法。涵盖process_request、process_response及process_exception三大核心函数的实现逻辑,演示如何通过中间件进行UA伪装、响应数据篡改(结合Selenium处理动态加载)以及代理IP设置,并说明在settings.py中启用中间件的具体配置步骤。
下载中间件
在每个Scrapy项目中,默认存在一个名为 middlewares.py 的文件,专门用于存放中间件代码。其中,下载中间件的类通常命名为 XxxDownloaderMiddleware(Xxx为项目名),该类主要包含以下三个核心方法。
def process_request(self, request, spider):
return Nonedef process_response(self, request, response, spider):
return responsedef process_exception(self, request, exception, spider):
passprocess_request
该方法用于拦截发出的请求。开发者可在此处实现User-Agent(UA)伪装,例如从自定义的UA池中随机选取一个头部信息附加到请求中。需要注意的是,UA池的具体实现需由开发者自行编写。
def process_request(self, request, spider):
# UA伪装,从UA池随机一个
request.headers['User-Agent'] = random.choice(self.user_agent_list)
return Noneprocess_response
该方法用于拦截服务器返回的响应。在此处可以对响应数据进行修改或篡改。若需获取动态加载的数据,可将Selenium与Scrapy结合使用:在中间件中调用Selenium浏览器对象获取页面源码,并构造新的HtmlResponse对象返回,从而替代原始响应。
def process_response(self, request, response, spider):
# 浏览器对象
bro = spider.bro
# 参数spider是爬虫对象
# 挑选出指定响应对象进行篡改url->request->response
bro.get(request.url)
page_text = bro.page_source # 包含了动态加载的数据
# 针对定位到的response篡改
# 实例化新的响应对象(包含动态加载的数据)
response = HtmlResponse(url=bro.current_url, body=page_text, encoding='utf-8', request=request)
return response在爬虫文件(Spider)中,需预先实例化Selenium的浏览器对象,并将其作为爬虫对象的属性,以便在中间件中调用。
import scrapy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver import ChromeOptions
class XxxSpider(scrapy.Spider):
name = 'xxx'
# allowed_domains = ['www.xxx.com']
start_urls = ['……']
def __init__(self):
service = Service('/Users/soutsukyou/PyCharm_Workspace/网络爬虫/study_selenium/chromedriver')
chrome_options = ChromeOptions()
# 规避检测
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 实例化浏览器
self.bro = webdriver.Chrome(service=service, options=chrome_options)process_exception
该方法用于拦截发生异常的请求。通常在此处配置代理IP池,根据请求协议(http或https)从对应的代理池中随机选取IP并设置到request.meta中,随后返回request以触发重新请求。两个代理IP池的具体实现需由开发者自行编写。
def process_exception(self, request, exception, spider):
# 可以设置代理ip
if request.url.split(':')[0] == 'http':
request.meta['proxy'] = 'http://'+random.choice(self.PROXY_http)
if request.url.split(':')[0] == 'https':
request.meta['proxy'] = 'https://'+random.choice(self.PROXY_https)
# 重新请求发送
return request其它
编写完成后,必须在项目的 settings.py 文件中配置 DOWNLOADER_MIDDLEWARES 字典,启用对应的中间件类并指定优先级,配置方可生效。
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
'xxx.middlewares.XxxDownloaderMiddleware': 543,
}以上介绍了Python爬虫框架Scrapy中下载中间件的编写与配置方法。如需了解更多Scrapy中间件相关内容,可参考本站其他文章或继续浏览后续章节,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









