使用scrapy对同一名称抓取多个唯一项

时间:2014-07-15 09:27:44

标签: python scrapy web-crawler scrapy-spider

我必须抓取以下url,其中基本上包含评论。所有评论都有评论作者姓名,评论标题和评论本身。

我已选择" python-scrapy"做这个任务。

但是提到的网址不是起始网址,我将从基本的parse方法中获取它。在解析中,我将初始化itemLoder。我将在那里提取几个项目并通过响应的meta传递项目。 (提取的字段包含酒店名称,地址,定价等信息....)

我还宣布了一些项目,即" review_member_name"," review_quote"," review_review"

页面中有多个评论,可以从response.url获取评论的评论ID。 (在下面的解析方法中显示)

因为有很多评论,并且所有评论都会共享相同的项目名称,所以这些项目会连接,这不应该发生。任何人都可以建议我解决这个问题吗?

下面是我的parse_review来源。

def parse_review(self,response):
    review_nos = re.search(".*www\.tripadvisor\.in/ExpandedUserReviews-.*context=1&reviews=(.+)&servlet=Hotel_Review&expand=1",response.url).group(1)
    review_nos = review_nos.split(',') # list of review ids

    for review_no in review_nos:
        item = response.meta['item']
        #item = ItemLoader(item=TripadvisorItem(), response=response) - this works fine but I will lose the items from parse method
        div_id = "expanded_review_"+review_no
        review = response.xpath('/html/body/div[@id="%s"]'%div_id)
        member_name = review.xpath('.//div[@class="member_info"]//div[@class="username mo"]//text()').extract()
        if member_name:
            item.add_value('review_member_name', member_name)

        review_quote = review.xpath('.//div[@class="innerBubble"]/div[@class="quote"]//text()').extract()
        if review_quote:
            item.add_value('review_quote', review_quote)

        review_entry = review.xpath('.//div[@class="innerBubble"]/div[@class="entry"]//text()').extract()
        if review_entry:
            item.add_value('review_review', review_entry)

        yield item.load_item()

以下是我的items.json(" review_review"正在删除,而且解析方法中的项目也被移除)

[{"review_quote": "\u201c Fabulous service \u201d", "review_member_name": "VimalPrakash"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d", "review_member_name": "VimalPrakash Jessica P"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d \u201c Nice hotel in a central location \u201d", "review_member_name": "VimalPrakash Jessica P VikInd"}]

请为这个问题提出一个好的标题。

1 个答案:

答案 0 :(得分:0)

在对ItemLoader进行操作之前,您必须先创建新的add_value;现在,您正在创建一个项目,并在循环中一次又一次地为其添加新值。

for review_no in review_nos:
    item = ItemLoader(item=projectItem(), response=response)

    ...

    yield item.load_item()

您也可以使用.add_xpath直接使用您提供的xpath,并在创建response.xpath时使用ItemLoader作为项目的选择器,这样您就可以避免所有if测试并让负载执行它应该做的事情:加载项目。