Я пытался очистить сайт 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)
Я обновил запрос до FormRequest. Проблема все еще сохраняется ....
Есть ли в теле ответа сообщение, которое возвращает код состояния 400? Эта информация была бы очень полезной.
@dethos Не могли бы вы сообщить мне, как получить информацию из тела ответа?
Вы можете увидеть пример того, как получить доступ к телу ошибки запроса на этот раздел документации






У меня была такая же проблема,
Я справился с этим, добавив мета-аргумент в параметры 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)
Вы не должны использовать там метод
.from_response. Вместо этого используйте толькоyield scrapy.FormRequest(...).