gpt4 book ai didi

python - Scrapy:在下载器中间件中返回 FormRequest

转载 作者:行者123 更新时间:2023-12-04 10:05:34 24 4
gpt4 key购买 nike

我正在抓取的网站有时会重定向到带有我想在下载器中间件中处理的表单的页面。这个想法是每次发生这种重定向时,它都会自动提交表单并检索结果。我的中间件看起来像:

from scrapy import FormRequest

class SubmitFormMiddleware:
def process_response(self, request, response, spider):
if response.css('form.loginbox').getall():
post_form_url = response.css('form.loginbox::attr(action)').get()
return FormRequest(url=response.urljoin(post_form_url),
formdata={'username': 'my_username',
'password': 'my_password',
'data_selection': 'all'
},
method='POST',
dont_filter=True)
else:
return response

这不起作用,因为我没有定义任何回调(我不应该因为我在中间件中):
NotImplementedError: DefaultSpider.parse callback is not defined

如果我只想返回一个请求,我会有类似的东西:
redirected = request.replace(url=response.urljoin(post_form_url))
return self._redirect(redirected, request, spider, response.status)

但这不适用于提交表单。有谁知道在下载器中间件中使用 FormRequest 的“Scrapy-thonic”方式是什么?

最佳答案

我设法通过以下方式解决了这个问题:

from scrapy import FormRequest

class SubmitFormMiddleware:
def process_response(self, request, response, spider):
if response.css('form.loginbox').getall():
post_form_url = response.css('form.loginbox::attr(action)').get()
form_request_handle = FormRequest(url=response.urljoin(post_form_url),
formdata={'username': 'my_username',
'password': 'my_password',
'data_selection': 'all'
},
method='POST',
dont_filter=True)
return request.replace(url=form_request_handle.url,
method='POST',
body=form_request_handle.body,
headers=form_request_handle.headers,
dont_filter=True)
else:
return response

虽然这有效,但我仍然对解决提交 FormRequest 的“scrapy-thonic”方式感到好奇。在中间件中。

关于python - Scrapy:在下载器中间件中返回 FormRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61607132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com