Scrapy: вернуть FormRequest в промежуточном программном обеспечении загрузчика - PullRequest
1 голос
/ 05 мая 2020

Веб-сайт, который я просматриваю, иногда перенаправляет на страницу с формой, которую я хотел бы обработать в промежуточном программном обеспечении загрузчика. Идея состоит в том, что каждый раз, когда происходит это перенаправление, оно автоматически отправляет форму и получает результаты. Мое промежуточное программное обеспечение выглядит примерно так:

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)

, но это не работает для отправки формы. Кто-нибудь знает, что такое способ Scrapy-thoni c использовать FormRequest в промежуточном программном обеспечении загрузчика?

1 Ответ

1 голос
/ 05 мая 2020

Мне удалось решить эту проблему следующим образом:

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

Хотя это работает, мне все еще интересно узнать о способе 'scrapy-thoni c' для решения отправить FormRequest в промежуточное ПО.

...