我正在尝试刮取TripAdvisor的评论,但是我找不到Xpath让它动态地遍历所有页面。我尝试了yield和回调,但问题是我找不到下一页行的xpath。我说的是本站
以下是我的代码(更新):
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapingtest.items import ScrapingTestingItem
class scrapingtestspider(Spider):
name = "scrapytesting"
allowed_domains = ["tripadvisor.in"]
base_uri = "tripadvisor.in"
start_urls = [
"http://www.tripadvisor.in/Hotel_Review-g297679-d300955-Reviews-Ooty_Fern_Hill_A_Sterling_Holidays_Resort-Ooty_Tamil_Nadu.html"]
output_json_dict = {}
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//a[contains(text(), "Next")]/@href').extract()
items = []
i=0
for sites in sites:
item = ScrapingTestingItem()
#item['reviews'] = sel.xpath('//p[@class="partial_entry"]/text()').extract()
item['subjects'] = sel.xpath('//span[@class="noQuotes"]/text()').extract()
item['stars'] = sel.xpath('//*[@class="rate sprite-rating_s rating_s"]/img/@alt').extract()
item['names'] = sel.xpath('//*[@class="username mo"]/span/text()').extract()
items.append(item)
i+=1
sites = sel.xpath('//a[contains(text(), "Next")]/@href').extract()
if(sites and len(sites) > 0):
yield Request(url="tripadvisor.in" + sites[i], callback=self.parse)
else:
yield items发布于 2015-07-16 08:45:23
如果您想选择下一步后面的URL,为什么不尝试如下所示:
next_url = response.xpath('//a[contains(text(), "Next")]/@href).extract()然后用这个网址yield一个请求?这样,您总是得到下一个站点刮擦,而不需要行包含数字。
最近,我在tripadvisor上做了一些类似的事情,这种方法对我起了作用。如果这不适用于您,那么使用您正在尝试的方法更新您的代码,看看它可以在哪里被批准。
更新并将Request创建块更改为:
if(sites and len(sites) > 0):
for site in sites:
yield Request(url="http://tripadvisor.in" + site, callback=self.parse)每次解析结束时,在循环结束时删除else部件和yield items。
发布于 2016-07-26 09:24:57
我认为只有当您在.txt文件中列出要销毁的urls列表时,它才能工作。
class scrapingtestspider(Spider):
name = "scrapytesting"
allowed_domains = ["tripadvisor.in"]
base_uri = "tripadvisor.in"
f = open("urls.txt")
start_urls = [url.strip() for url in f.readlines()]
f.close()https://stackoverflow.com/questions/31449227
复制相似问题