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