скраповый обход 405

#scrapy #http-status-code-405

#scrapy #http-status-code-405

Вопрос:

 start_urls = ['https://www.qichacha.com/search?key=北京证大向上']
def parse(self, response):
    # the start_url is a list page, the company_url is a detail_url from the list page
    yield scrapy.Request(url=company_url, meta={"infos":info},callback=self.parse_basic_info, dont_filter=True)
  

когда запрашивается company_url, затем ответ 405,
но, если я использую

 response = requests.get(company_url, headers=headers)
print(response.code)
print(response.txt)
  

затем ответ 200 и можно проанализировать HTML-страницу, или

 start_urls=[company_url]
def parse(self, response):
    print(response.code)
    print(response.txt)
  

а также ответ 200, я не знаю, почему ответ 405
когда он отвечает 405, я печатаю запрос следующим образом:
{‘_encoding’: ‘utf-8’, ‘method’: ‘GET’, ‘_url’: ‘https://www.qichacha.com/firm_b18bf42ee07d7961e91a0edaf1649287.html ‘, ‘_body’: b», ‘priority’: 0, ‘callback’: Нет, ‘errback’: Нет, ‘cookies’: {}, ‘headers’: {b’User-Agent’: [b’Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit /535.20 (KHTML, как у Геккона) Chrome / 19.0.1036.7 Safari/535.20′]}, ‘dont_filter’: False, ‘_meta’: {‘глубина’: 1}, ‘flags’: []}
что с этим не так?

Ответ №1:

Похоже, что страница блокирует Scrapy, используя строку пользовательского агента по умолчанию. Запуск spider, подобный этому, работает для меня:

 scrapy runspider -s USER_AGENT="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" spider.py
  

В качестве альтернативы, вы можете установить USER_AGENT в settings.py вашем проекте. Или используйте что-то вроде scrapy-fake-useragent для автоматической обработки этого.

Комментарии:

1. Я использовал этот способ, но всегда получал ответ 405, и я использовал UserAgentMiddleware для автоматического изменения user_agent