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

标签 python scrapy middleware

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

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/

相关文章:

python - 扭曲连接丢失事件

python - 如何在 Windows 上使用 Python 的 "easy_install"... 没那么容易

cookies - Scrapy:使用 Selenium webdriver 登录,将 cookie 传输到蜘蛛对象?

node.js - 对除特定路径之外的所有路径使用 Express 中的特定中间件

c# - Asp.Net Core 2.x 中间件语法

java - 从Java Web应用程序控制C应用程序

python - 使用 Hadoop 流式处理线程

python - 获取运行python脚本的Windows计算机的名称?

xpath - Scrapy - 从表中提取项目

Scrapy: USER_AGENT 和 ROBOTSTXT_OBEY 设置正确,但我仍然得到错误 403