Scrapy View перенаправить на другую страницу и получить ошибку <400> - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь сделать просмотр Scrap или получить https://www.watsons.com.sg, и страница будет перенаправлена ​​и вернет ошибку <400>.Интересно, есть ли способ обойти это?Журнал показывает что-то вроде этого:

2018-11-15 22:54:15 [scrapy.core.engine] INFO: Spider opened
2018-11-15 22:54:15 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-11-15 22:54:15 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-11-15 22:54:15 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET 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> from **<GET https://www.watsons.com.sg>
2018-11-15 22:54:16 [scrapy.core.engine] DEBUG: Crawled (400)** <GET 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> (referer: None)
2018-11-15 22:54:17 [scrapy.core.engine] INFO: Closing spider (finished)

Если я использую request.get ("https://www.watsons.com.sg") хорошо. Любая идея или комментарий очень ценятся. Спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Хорошо, это одно из странных поведений 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, то при следующем запросе он добавляет отсутствующие /:

Firefox adds the missing slash

Впрочем, как-то скрапа не делает этого! Если вы посмотрите на свои журналы, когда получена ошибка 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
...