Python Scrapy: ответ 400 на запрос формы

Я пытался очистить сайт https://fbschedules.com/new-england-patriots-schedule/

Этот веб-сайт использует скрытую форму для отправки запроса ajax в файл php: https://fbschedules.com/wp-admin/admin-ajax.php

После попытки смоделировать запрос AJAX scrapy возвращает ответ 400 для этого кода:

def parse(self, response):
    headers = {
        'User_Agent': user_agent,
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate, br',
        'Referer': 'https://fbschedules.com/new-england-patriots-schedule/',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
        'Cookie': cookie,
        'DNT': '1',
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0'
    }

    data = {
        'action': 'load_fbschedules_ajax',
        'type': 'NFL',
        'display': 'Season',
        'team': 'New+England+Patriots',
        'current_season': '2018',
        'view': '',
        'conference': '',
        'conference-division': '',
        'ncaa-subdivision': '',
        'ispreseason': '',
        'schedule-week': '',
    }

    yield scrapy.FormRequest.from_response('https://fbschedules.com/wp-admin/admin-ajax.php',
                                           headers=headers,
                                           formdata=data,
                                           method='POST',
                                           callback=self.schedule_parse)

Любая помощь в правильном направлении приветствуется!

Обновлено: я также должен упомянуть, что я запускаю этого паука как один скрипт, используя:

def start():
    configure_logging()
    runner = CrawlerRunner()
    runner.crawl(NflSpider)
    d = runner.join()
    d.addBoth(lambda _: reactor.stop())

    reactor.run()

чтобы начать сканирование страницы. Консольный вывод выглядит следующим образом:

2018-09-02 18:20:33 [scrapy.core.engine] INFO: Spider opened

2018-09-02 18:20:33 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

2018-09-02 18:20:33 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6024

2018-09-02 18:20:33 [scrapy.core.engine] DEBUG: Crawled (400) https://fbschedules.com/wp-admin/admin-ajax.php> (referer: None)

2018-09-02 18:20:33 [scrapy.spidermiddlewares.httperror] INFO: Ignoring response <400 https://fbschedules.com/wp-admin/admin-ajax.php>: HTTP status code is not handled or not allowed

2018-09-02 18:20:33 [scrapy.core.engine] INFO: Closing spider (finished)

Вы не должны использовать там метод .from_response. Вместо этого используйте только yield scrapy.FormRequest(...).

Valdir Stumm Junior 02.09.2018 23:03

Я обновил запрос до FormRequest. Проблема все еще сохраняется ....

woodfordb 02.09.2018 23:31

Есть ли в теле ответа сообщение, которое возвращает код состояния 400? Эта информация была бы очень полезной.

dethos 03.09.2018 00:03

@dethos Не могли бы вы сообщить мне, как получить информацию из тела ответа?

woodfordb 03.09.2018 01:25

Вы можете увидеть пример того, как получить доступ к телу ошибки запроса на этот раздел документации

Lucas Wieloch 03.09.2018 17:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
5
1 918
1

Ответы 1

У меня была такая же проблема, Я справился с этим, добавив мета-аргумент в параметры FormRequest.

Попробуйте использовать scrapy.FormRequest вместо scrapy.FormRequest.from_response:

meta = {'handle_httpstatus_all': True}
yield FormRequest('https://fbschedules.com/wp-admin/admin-ajax.php',
                                           headers=headers,
                                           formdata=data,
                                           method='POST',
                                           meta=meta,
                                           callback=self.schedule_parse)

Другие вопросы по теме