首页 > 解决方案 > 使用scrapy规则访问“下一页”

问题描述

我最近回到了几个月前制作的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):

这就像一个月前一样工作,但我现在不能让它工作。

有什么想法吗?

标签: python-3.xxpathweb-scrapingscrapy

解决方案


亚马逊有一个反机器人机制,可以在一些迭代后请求验证码。您可以确认它检查返回的 HTTP 代码,如果它正在等待验证码,您应该会收到类似503 Service Unavailable. 我在您的代码片段上没有看到任何错误(除了{}代替()on rules,这实际上不会影响结果,因为您仍然可以迭代它)。

此外,确保你的蜘蛛是继承的CrawlSpider,而不是Scrapy


推荐阅读