Scrapy - получить URL при достижении максимального количества перенаправлений [301] - PullRequest
2 голосов
/ 10 марта 2020

Код

# -*- coding: utf-8 -*-
import scrapy
import pandas as pd
from ..items import Homedepotv2Item
from scrapy.http import HtmlResponse


class HomedepotspiderSpider(scrapy.Spider):
    name = 'homeDepotSpider'
    #allowed_domains = ['homedepot.com']

    start_urls = ['https://www.homedepot.com/p/305031636', 'https://www.homedepot.com/p/311456581']
    handle_httpstatus_list = [301]

def parseHomeDepot(self, response):

    #get top level item
    items = response.css('.pip-container-fluid')
    for product in items:
        item = Homedepotv2Item()

        productSKU = product.css('.modelNo::text').getall() #getSKU

        productURL = response.request.url #Get URL


        item['productSKU'] = productSKU
        item['productURL'] = productURL

        yield item

Сообщения терминала

Без handle_httpstatus_list = [301]

2020-03-12 12:24:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wall-Mount-Range-Hood-in-DuraSnow-%C3%91-Stainless-Steel-8687S-30-8687S-30/305031636> from <GET https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wall-Mount-Range-Hood-in-DuraSnow-%C3%91-Stainless-Steel-8687S-30-8687S-30/305031636>
2020-03-12 12:24:58 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wooden-Wall-Mount-Range-Hood-in-Walnut-Includes-Remote-Motor-KBRR-RS-30/311456581>
{'productName': ['ZLINE 30 in. Wooden Wall Mount Range Hood in Walnut - '
                 'Includes  Remote Motor'],
 'productOMS': '311456581',
 'productPrice': ['                                    979.95'],
 'productSKU': ['KBRR-RS-30'],
 'productURL': 'https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wooden-Wall-Mount-Range-Hood-in-Walnut-Includes-Remote-Motor-KBRR-RS-30/311456581'}

2020-03-12 12:25:01 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wall-Mount-Range-Hood-in-DuraSnow-%C3%91-Stainless-Steel-8687S-30-8687S-30/305031636> from <GET https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wall-Mount-Range-Hood-in-DuraSnow-%C3%91-Stainless-Steel-8687S-30-8687S-30/305031636>
2020-03-12 12:25:01 [scrapy.downloadermiddlewares.redirect] DEBUG: Discarding <GET https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-ZLINE-30-in-Wall-Mount-Range-Hood-in-DuraSnow-%C3%91-Stainless-Steel-8687S-30-8687S-30/305031636>: max redirections reached
2020-03-12 12:25:01 [scrapy.core.engine] INFO: Closing spider (finished)
2020-03-12 12:25:01 [scrapy.extensions.feedexport] INFO: Stored csv feed (1 items) in: stdout:

С handle_httpstatus_list = [301]

2020-03-12 12:27:30 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-03-12 12:27:31 [scrapy.core.engine] DEBUG: Crawled (301) <GET https://www.homedepot.com/p/305031636> (referer: None)
2020-03-12 12:27:31 [scrapy.core.engine] DEBUG: Crawled (301) <GET https://www.homedepot.com/p/311456581> (referer: None)
2020-03-12 12:27:31 [scrapy.core.engine] INFO: Closing spider (finished)

это то, что я использую для экспорта в Excel scrapy crawl homeDepotSpider -t csv -o - > "pathname"

Проблема

Итак, проблема, с которой я столкнулся изначально «https://www.homedepot.com/p/305031636» игнорируется моим пауком, потому что ссылка сбрасывает код ошибки 301 (слишком много перенаправлений). После исследования проблемы я обнаружил, что handle_httpstatus_list = [301] должен был решить эту проблему. Однако, когда я использую этот фрагмент кода, поскольку рабочая ссылка ('https://www.homedepot.com/p/311456581') перенаправляет на другую страницу, она также игнорируется.

По сути, я хочу сканировать данные со всех URL-адресов, которые не имеют

ERR_TOO_MANY_REDIRECTS  

, но извлекать URL-адреса из ссылок, которые имеют этот код ошибки, а затем экспортировать эти данные чтобы преуспеть.

Редактировать: Лучший способ задать мой вопрос: Поскольку все URL-адреса, с которыми я работаю go через перенаправление, как я могу обрабатывать страницы, которые не перенаправляют, и захватывать эти URL-адреса ?

Кроме того, это не вся моя программа, я включил только те части, которые, по моему мнению, были необходимы для программы.

1 Ответ

2 голосов
/ 17 марта 2020

Вы можете вручную обработать код ошибки 301 следующим образом:

class HomedepotspiderSpider(scrapy.Spider):
    name = 'my_spider'
    retry_max_count = 3

    start_urls = ['https://www.homedepot.com/p/305031636', 'https://www.homedepot.com/p/311456581']
    handle_httpstatus_list = [301]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.retries = {} # here are stored URL retries counts

    def parse(self, response):
        if response.status == 301:
            retries = self.retries.setdefault(response.url, 0)
            if retries < self.retry_max_count:
                self.retries[response.url] += 1
                yield response.request.replace(dont_filter=True)
            else:
                # ...
                # DO SOMETHING TO TRACK ERR_TOO_MANY_REDIRECTS AND SAVE response.url
                # ...

            return

Обратите внимание, что для перенаправления можно использовать также код 302.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...