Scrapy Spider无法访问我想要的链接

时间:2018-12-24 12:20:01

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

几天前,我尝试为蜘蛛的解析器添加一些功能。 我的目标是抓取一些亚马逊页面,问题是我需要使解析器针对要搜索的每种产品以不同的方式工作。 例如,如果我想搜索笔记本电脑,那么我的解析器会以某种方式工作,但是如果我搜索鞋子,则其工作方式会有所不同。我是这样做的:

def start_requests(self):

    keyword_callback = {

        'Laptop' : self.parse_item
    }


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

    keywords = txtfile.readlines()

    txtfile.close()

    for keyword in keywords:


        yield Request(self.search_url.format(keyword), callback = keyword_callback[keyword])

这里遇到的问题是,当我执行yield请求时,我的蜘蛛不会“搜索”关键字并输入链接,因此解析器仅获得1个链接而没有数据。

如果需要任何其他信息,请务必询问!

编辑:添加其他信息

class PrototipoAmazonV1Spider(CrawlSpider):

    name = 'spiderProtAmazon'

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

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

    rules = {

    #Todos los elementos en la pagina
    Rule(LinkExtractor(allow =(), restrict_xpaths = ('//*[contains(@class, "s-access-detail-page")]') ), 
                            callback = 'parse_item', follow = False)
}


#Previous start request goes here

def parse_item(self, response):

    amz_item = Prototipoamazonv1Item()

    #info de producto
    amz_item['nombreProducto'] = response.xpath('normalize-space(//span[contains(@id, "productTitle")]/text())').extract()

    amz_item['urlProducto'] = response.request.url

    yield amz_item

我目前正在使用1个解析器,而我尝试这样做是否可行。我的想法是为每个关键字使用不同的解析器。

运行该程序时,我唯一获得的数据是从'urlProducto'

'urlProducto'='https://www.amazon.com/s?field-keywords=Laptop'

问题是我的蜘蛛没有“进入”每个产品以获取数据。如果我将前一个URL(urlProducto)强制作为起始URL,那么它就可以正常工作。

1 个答案:

答案 0 :(得分:1)

Scrapy不会自动解析URL以再次爬网,要么您需要通过链接提取程序Rule,要么需要从源获取下一个URL,然后将其传递给另一个方法

以您为例,您需要获取每个项目的此锚标签的href,然后创建一个scrapy Request来解析该页面中的内容。

def parse_item(self, response):
     for item in response.xpath("//div[contains(@class,'s-result-item')]"):
          url = //search for the detail page url
          yield Scrapy.Request(url,self.parse_detail)

def parse_detail(self, response):
     //here you need to define what you want to get from detail page