Хорошо, это одно из странных поведений scrapy
.
Если вы посмотрите на заголовок location
в HTTP-ответе (например, с помощью инструментов разработчика Firefox), вы увидите:
location: https://queue.watsons.com.sg?c=aswatson&e=watsonprdsg&ver=v3-java-3.5.2&cver=55&cid=zh-CN&l=PoC+Layout+SG&t=https%3A%2F%2Fwww.watsons.com.sg%2F
Обратите внимание, что между .com.sg
и ?
.
нет
/
.
Если посмотреть на поведение Firefox, то при следующем запросе он добавляет отсутствующие /
:
Впрочем, как-то скрапа не делает этого!
Если вы посмотрите на свои журналы, когда получена ошибка HTTP 400, мы увидим, что /
отсутствует.
Это обсуждается в этом выпуске: https://github.com/scrapy/scrapy/issues/1133
На данный момент я обошел это, имея собственное промежуточное ПО загрузчика, которое нормализует заголовок location
, до того, как ответ будет передан в промежуточное ПО перенаправления.
Это выглядит так:
from scrapy.spiders import Spider
from w3lib.url import safe_download_url
class MySpider(Spider):
name = 'watsons.com.sg'
start_urls = ['https://www.watsons.com.sg/']
custom_settings = {
'DOWNLOADER_MIDDLEWARES': {
'spiders.myspider.FixLocationHeaderMiddleWare': 650
}
}
def parse(self, response):
pass
class FixLocationHeaderMiddleWare:
def process_response(self, request, response, spider):
if 'location' in response.headers:
response.headers['location'] = safe_download_url(response.headers['location'].decode())
return response