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