Scrapy 蜘蛛无法访问我想要的 link
Scrapy spider not accessing the link i want to
几天前,我尝试向蜘蛛的解析器添加一些功能。
我的 objective 是为了抓取一些亚马逊页面,问题是我需要让解析器针对我想要搜索的每个产品以不同的方式工作。
例如,如果我想搜索笔记本电脑,我的解析器会以某种方式工作,但如果我搜索鞋子,它的工作方式会有所不同。我是这样做的:
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 请求时,我的蜘蛛不是 "searching" 关键字并输入 link,所以解析器只得到 1 link 没有数据。
如果需要任何额外信息,请务必询问!
编辑:添加额外信息
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'
问题是我的蜘蛛没有得到 "inside" 每个产品来检索数据。如果我强制以前的 url (urlProducto) 作为开始,它工作得很好。
Scrapy 不会自动解析 url 来再次抓取,要么你需要通过 link 提取器规则,要么需要从源中获取下一个 url 然后将其传递给另一种方法
在您的情况下,您需要获取每个项目的锚标记的 href,然后创建一个 scrapy 请求来解析该页面中的内容。
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
几天前,我尝试向蜘蛛的解析器添加一些功能。 我的 objective 是为了抓取一些亚马逊页面,问题是我需要让解析器针对我想要搜索的每个产品以不同的方式工作。 例如,如果我想搜索笔记本电脑,我的解析器会以某种方式工作,但如果我搜索鞋子,它的工作方式会有所不同。我是这样做的:
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 请求时,我的蜘蛛不是 "searching" 关键字并输入 link,所以解析器只得到 1 link 没有数据。
如果需要任何额外信息,请务必询问!
编辑:添加额外信息
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'
问题是我的蜘蛛没有得到 "inside" 每个产品来检索数据。如果我强制以前的 url (urlProducto) 作为开始,它工作得很好。
Scrapy 不会自动解析 url 来再次抓取,要么你需要通过 link 提取器规则,要么需要从源中获取下一个 url 然后将其传递给另一种方法
在您的情况下,您需要获取每个项目的锚标记的 href,然后创建一个 scrapy 请求来解析该页面中的内容。
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