Доступ к следующей странице с правилами скрапа - PullRequest
0 голосов
/ 04 июня 2019

Я недавно вернулся к коду scopy, созданному несколько месяцев назад.

Целью кода было очистить некоторые продукты Amazon для данных, он работал так:

Давайте возьмемэта страница в качестве примера

https://www.amazon.com/s?k=mac+makeup&crid=2JQQNTWC87ZPV&sprefix=MAC+mak%2Caps%2C312&ref=nb_sb_ss_i_1_7

Код вводит каждый продукт этой страницы и получает данные с него, после того как он завершил сбор всех данных с этой страницы, он переместилсяк следующему (в данном случае стр. 2).

Эта последняя часть перестала работать.

У меня есть что-то подобное в правилах (мне пришлось переписать некоторые xpath, потому чтоони устарели)

import scrapy
import re
import string
import random
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapyJuan.items import GenericItem
from scrapy.exceptions import CloseSpider
from scrapy.http import Request

class GenericScraperSpider(CrawlSpider):

    name = "generic_spider"

    #Dominio permitido
    allowed_domain = ['www.amazon.com']

    search_url = 'https://www.amazon.com/s?field-keywords={}'

    custom_settings = {

        'FEED_FORMAT': 'csv',
        'FEED_URI' : 'GenericProducts.csv'

    }

rules = {

        #Next button
        Rule(LinkExtractor(allow =(), restrict_xpaths = ('//li[@class="a-last"]/a/@href') )),

        #Every element of the page

        Rule(LinkExtractor(allow =(), restrict_xpaths = ('//a[contains(@class, "a-link-normal") and contains(@class,"a-text-normal")]') ), 
                                callback = 'parse_item', follow = False)

    }

def start_requests(self):

        txtfile = open('productosGenericosABuscar.txt', 'r')

        keywords = txtfile.readlines()

        txtfile.close()

        for keyword in keywords:

            yield Request(self.search_url.format(keyword))



    def parse_item(self,response):

Это сработало, как месяц назад, но я не могу заставить его работать сейчас.

Есть идеи, что случилось?

1 Ответ

2 голосов
/ 04 июня 2019

У Amazon есть механизм антибота для запроса капчи после нескольких итераций. Вы можете подтвердить это, проверив возвращенный HTTP-код, если он ожидает проверки, вы должны получить что-то вроде 503 Service Unavailable. Я не вижу ничего плохого в вашем фрагменте кода (кроме {} вместо () на rules, что на самом деле не влияет на результаты, поскольку вы все еще можете выполнять итерацию по нему).

Кроме того, убедитесь, что ваш паук наследует CrawlSpider, а не Scrapy

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