Scrapy - каждая страница очищается, но Scrap оборачивается и очищает первое x количество страниц - PullRequest
3 голосов
/ 18 февраля 2020
class HomedepotcrawlSpider(CrawlSpider):

    name = 'homeDepotCrawl'
    #allowed_domains = ['homedepot.com']
    start_urls =['https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=0']

    def parse(self, response):

        for item in self.parseHomeDepot(response):
            yield item

        next_page_url = response.xpath('//link[@rel="next"]/@href').extract_first()
        if next_page_url:
            yield response.follow(url=next_page_url, callback=self.parse)



    def parseHomeDepot(self, response):

        items = response.css('.plp-pod')
        for product in items:
            item = HomedepotSpiderItem()

    #get SKU
            productSKU = product.css('.pod-plp__model::text').getall()

    #get rid of all the stuff i dont need
            productSKU = [x.strip(' ') for x in productSKU] #whiteSpace
            productSKU = [x.strip('\n') for x in productSKU]
            productSKU = [x.strip('\t') for x in productSKU]
            productSKU = [x.strip(' Model# ') for x in productSKU] #gets rid of the model name
            productSKU = [x.strip('\xa0') for x in productSKU] #gets rid of the model name



            item['productSKU'] = productSKU

            yield item

Объяснение проблемы

Вот часть программы, над которой я работал, чтобы очистить данные. Я оставил свой код для очистки других полей, потому что я не думал, что это необходимо включать в этот пост. Когда я запускаю эту программу и экспортирую данные в Excel, я получаю первые 240 элементов (10 страниц). Это доходит до строки 241 моей электронной таблицы (первая строка занята метками). Затем, начиная со строки 242, первые 241 строка повторяются еще раз. Затем снова в строках 482 и 722.

Скребок выводит первые 240 элементов 3 раза

РЕДАКТИРОВАТЬ Итак, я просматривал журнал во время очистки, и оказалось, что каждая страница была очищена. Последняя страница:

https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=696&Ns=None>

, а затем в лог-файле снова отображается первая страница, которая очищается, а это:

https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default

Я полагаю, что из-за .. enter image description here

Терминальная команда, которую я использую для экспорта в Excel:

scrapy crawl homeDepotCrawl -t csv -o - > "(File Location)"

Редактировать : причина, по которой я использую эту команду, заключается в том, что при экспорте Scrapy добавляет очищенные данные в файл, так что это стирает целевой файл и просто создает его снова.

Код, который я использовал для получения всех страниц:

<a class="hd-pagination__link" title="Next" href="/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&amp;Nao=24&amp;Ns=None" data-pagenumber="2"></a>

Изначально я думал, что это веб-сайт вызывает такое неожиданное поведение, поэтому в settings.py я изменил ROBOTSTXT_OBEY = 0 и я добавил задержку, но это ничего не изменило.

Так что я хотел бы помочь с:

- выяснение, почему выход CSV занимает только первые 240 Предметы (10 страниц) и повторяется 3 раза

-Как убедиться, что паук не go вернулся к первой странице е после выскабливания первых 30

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Я бы предложил сделать что-то подобное. Основное отличие заключается в том, что я беру информацию из json, хранящуюся на странице, и разбиваюсь на себя, распознавая, что Nao - это смещение продукта. Код также намного короче:

import requests,json,re
product_skus = set()
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
base_url = 'https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=%s'
for page_num in range(1,1000):
    url = base_url % (page_num*24)
    res = requests.get(url, headers=headers)
    json_data = json.loads(re.search(r'digitalData\.content=(.+);', res.text).group(1))
    prev_len = len(product_skus)
    for product in json_data['product']:
        product_skus.add(product['productInfo']['sku'])
    if len(product_skus) == prev_len: break # this line is optional and can determine when you want to break

Кроме того, он выглядит как страницы Home Depot повтор каждые 10 страниц (по крайней мере, в том, что вы отправили), поэтому вы видите ограничение 240. Вот пример из его просмотра:

enter image description here

1 голос
/ 21 февраля 2020

Вы действительно переходите к началу, chrome инструменты разработчика показывают, что «следующий» указывает на первый набор элементов, когда вы достигаете конца.

Вы можете обнаружить и обойти это с помощью логики c, который просматривает текущий индекс элемента:

>>> from urllib.parse import urlparse, parse_qs
>>> url = 'https://www.homedepot.com/b/Appliances/ZLINE-Kitchen-and-Bath/N-5yc1vZbv1wZhsy?experienceName=default&Nao=696&Ns=None'
>>> parsed = urlparse(url)
>>> page_index = int(parse_qs(parsed.query)['Nao'][0])
>>> page_index
696

и отредактируйте if next_page_url logi c, включив в него logi c как and page_index > last_page_index

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