使用不规则的规则进入“下一页”页面

时间:2019-06-04 01:29:41

标签: python-3.x xpath web-scraping scrapy

我最近回到了几个月前创建的拼凑代码。

该代码的目标是刮取一些亚马逊产品以获取数据,其工作方式如下:

让我们以该页面为例

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 个答案:

答案 0 :(得分:2)

Amazon有一个反机器人机制,可以在某些迭代后请求验证码。您可以确认它检查返回的HTTP代码,如果正在等待验证码,您应该会收到类似503 Service Unavailable的信息。我没有发现您的代码段有什么问题(除了{}上的()上的rules之外,实际上并没有影响结果,因为您仍然可以对其进行迭代)

此外,请确保您的蜘蛛继承了CrawlSpider而不是Scrapy