如何使用scrapy和python动态抓取Tripadvisor

时间:2015-07-16 08:36:40

标签: python python-2.7 xpath web-scraping scrapy

我正在试图抓住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

2 个答案:

答案 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()