首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用scrapy和python动态抓取Tripadvisor

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

Stack Overflow用户
提问于 2015-07-16 08:36:40
回答 2查看 3.1K关注 0票数 1

我正在尝试刮取TripAdvisor的评论,但是我找不到Xpath让它动态地遍历所有页面。我尝试了yield和回调,但问题是我找不到下一页行的xpath。我说的是本站

以下是我的代码(更新):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-16 08:45:23

如果您想选择下一步后面的URL,为什么不尝试如下所示:

代码语言:javascript
复制
next_url = response.xpath('//a[contains(text(), "Next")]/@href).extract()

然后用这个网址yield一个请求?这样,您总是得到下一个站点刮擦,而不需要行包含数字。

最近,我在tripadvisor上做了一些类似的事情,这种方法对我起了作用。如果这不适用于您,那么使用您正在尝试的方法更新您的代码,看看它可以在哪里被批准。

更新并将Request创建块更改为:

代码语言:javascript
复制
if(sites and len(sites) > 0):
    for site in sites:
        yield Request(url="http://tripadvisor.in" + site, callback=self.parse)

每次解析结束时,在循环结束时删除else部件和yield items

票数 1
EN

Stack Overflow用户

发布于 2016-07-26 09:24:57

我认为只有当您在.txt文件中列出要销毁的urls列表时,它才能工作。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31449227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档