我草率地编写了一个脚本,以使请求通过自定义中间件传递,以便对该请求进行代理。但是,该脚本似乎对该中间件没有任何作用。当我打印response.meta
时,我得到{'download_timeout': 180.0, 'download_slot': 'httpbin.org', 'download_latency': 0.9680554866790771}
,它清楚地表明我的请求没有通过自定义中间件传递。我用过CrawlerProcess
来运行脚本。
spider
包含:
import scrapy
from scrapy.crawler import CrawlerProcess
class ProxySpider(scrapy.Spider):
name = "proxiedscript"
start_urls = ["https://httpbin.org/ip"]
def parse(self,response):
print(response.meta)
print(response.text)
if __name__ == "__main__":
c = CrawlerProcess({'USER_AGENT':'Mozilla/5.0'})
c.crawl(ProxySpider)
c.start()
middleware
包含:
class ProxiesMiddleware(object):
def process_request(self, request, spider):
request.meta['proxy'] = 'http://206.189.25.70:3128'
return request
我在settings.py
中所做的更改:
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
'proxyspider.middleware.ProxiesMiddleware': 100,
}
下图显示了项目层次结构: here
通过中间件发出代理请求应该带来什么可能的变化?
答案 0 :(得分:1)
也许返回None
而不是Request
?返回Request
会阻止其他任何下载程序中间件运行。
答案 1 :(得分:1)
您需要检查以下行的日志输出:[scrapy.middleware] INFO: Enabled downloader middlewares:
,以获取活动下载器中间件的列表。如果中间件处于活动状态,则它应该在列表中。
据我记得,现在已弃用了scrapy.contrib
个模块。
Scrapy: No module named 'scrapy.contrib'
您的带有自定义中间件的代码几乎可以使用scrapy命令行工具了。
scrapy crawl proxiedscript
。
收集器如果需要以脚本启动抓取应用程序,则您的搜寻器进程需要首先read_projects_settings
。
或将DOWNLOADER_MIDDLEWARES
设置定义为CrawlerProcess
的参数:
c = CrawlerProcess({
'USER_AGENT':'Mozilla/5.0',
'DOWNLOADER_MIDDLEWARES':{
#'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,#deprecated in scrapy 1.6
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':110, #enabled by default
'proxyspider.middleware.ProxiesMiddleware': 100,
},
})