我有一个基本的scrapy脚本,它正在执行以下操作:
使用规则获取所有页面:
rules = (
Rule(LinkExtractor(allow=(), restrict_xpaths=('//*[@id="pagination_top"]/a',)), callback="parse_page", follow= True),
)
在每个页面中,获取prod页面的所有链接:
def parse_page(self, response):
for href in response.css("#prod_category > ul > li > a::attr('href')"):
url = response.urljoin(href.extract())
yield scrapy.Request(url, callback=self.parse_dir_contents)
并访问每个产品页面以获取有关该产品的详细信息。然后,我从其他链接获取其他详细信息
def parse_dir_contents(self, response):
# select xpath here
print '________________________BEGIN PRODUCT________________________'
item = detailedItem()
item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()
# get url_2 from this page
request = scrapy.Request(url_2, callback=self.parse_detailed_contents)
request.meta['item'] = item
yield request
最后,这里有获取产品详细信息的功能
我认为最后一个parse_detailed_contents是我遇到问题的地方
def parse_detailed_contents(self, response):
item = response.meta['item']
sel = Selector(response)
sites = sel.xpath('//*[@id="prod-details"]')
print '________________________GETTING DETAILS________________________'
item['prod_details'] = sites.xpath('//*[@id="prod-details"]/div/text()').extract()
return item
问题是我的脚本会返回第一个链接的项目[' prod_details'],但不会返回后续链接的任何项目。
这是因为url_2在所有产品中都被传递了吗?
请有人帮忙。非常感谢提前!
答案 0 :(得分:2)
尝试添加 dont_filter = True
def parse_dir_contents(self, response):
# select xpath here
print '________________________BEGIN PRODUCT________________________'
item = detailedItem()
item['title'] = sites.xpath('//*[@id="product-name"]/text()').extract()
# get url_2 from this page
request = scrapy.Request(url_2, callback=self.parse_detailed_contents,dont_filter=True)
request.meta['item'] = item
yield request