Scrapy 在DownlaOrder中间件中创建新请求

Scrapy 在DownlaOrder中间件中创建新请求,scrapy,Scrapy,如何在代理设置处于活动状态时创建新请求 Middleware.py 从urllib.parse导入urlencode 从scrapy.http导入请求 def get_url(url): 有效负载={'api\u key':'my\u api','url':url} 代理服务器http://api.scraperapi.com/?'+urlencode(有效负载) 返回代理服务器url 类MyCustomDownloader: def过程_请求(自我、请求、蜘蛛): url=request.ur

如何在代理设置处于活动状态时创建新请求 Middleware.py

从urllib.parse导入urlencode
从scrapy.http导入请求
def get_url(url):
有效负载={'api\u key':'my\u api','url':url}
代理服务器http://api.scraperapi.com/?'+urlencode(有效负载)
返回代理服务器url
类MyCustomDownloader:
def过程_请求(自我、请求、蜘蛛):
url=request.url
返回请求(url=获取url)
def过程_响应(自身、请求、响应、爬行器):
返回响应
设置.py

DOWNLOADER\u中间件={
“usr157.Middleware.MyCustomDownloader”:543,
}
spider.py

类testSpider(scrapy.Spider): 名称='test' 起始URL=['http://httpbin.org/ip'] def解析(自我,响应): 打印(response.text)
当我运行
scrapy crawl test
时,它不会遇到一个请求,理想情况下,我想要的是使用
get\u URL
函数修改URL的一个请求。在您的实现中,生成的请求中没有回调

在大多数scrapy中间件(,)上,它们的
process\u请求
方法不会返回新的请求对象。它们修改原始请求的参数:

def process_request(self, request, spider)
    request.url=get_url(url)

正如我看到的,您希望使用
scraperapi
代理。 这个代理有自己的API来使用它。 这是一个来自官方页面的示例

#记住安装库:pip安装scraperapi sdk
从scraper_api导入scraper客户端
client=client('YOURAPIKEY')
结果=client.get(url=)http://httpbin.org/ip)。文本
打印(结果);
#Scrapy用户只需在他们的start_URL和parse函数中替换URL即可
#注意:对于Scrapy,您不应使用下载延迟和
#随机化\u下载\u延迟,这将降低您的并发性,并且不会
#需要我们的API
#…其他刮擦设置代码
start_url=[client.scrapyGet(url=]http://httpbin.org/ip')]
def解析(自我,响应):
#…这里是您的解析逻辑
生成scrapy.Request(client.scrapyGet(url=)http://httpbin.org/ip“),self.parse)
要使用中间件,您需要进行如下简单更改:

def进程请求(self、request、spider):
如果request.url中没有“api.scraperapi”:
新网址:http://api.scraperapi.com/?api_key=YOURAPIKEY&url='+request.url
请求=请求.替换(url=新url)
退货申请
其他:
一无所获

PS:没有
scraperapi
帐户来正确测试它。

你尝试过你的答案吗?它给我
属性错误:Request.url不可修改,请使用Request.replace()
它不工作,当我运行它时它会崩溃(PS上有免费试用版)请现在检查:)答案已更新并测试,每次工作都很好,有什么错误?因为我在本地对它进行了测试,没有出现任何错误,我收到了每个请求的新IP更改
请求
请求。替换
。这将创建一个与
请求
相同的新请求,但指定的更改除外。这是@georgiy的方法,但使用的是工作代码。