我正在试图抓住TripAdvisor的评论,但我找不到让它动态浏览所有页面的Xpath。我尝试了yield
并回调但事情是我无法找到进入下一页的行的xpath。我在谈论This site
这是我的代码(更新):
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
答案 0 :(得分:1)
如果你想选择Next下面的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
。
答案 1 :(得分:0)
我认为只有在您要在.txt文件中删除要删除的网址列表时,它才有效。
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()