2017-04-15 61 views
1

刮痧項目我寫了下面的蜘蛛颳了WebMD的網站病人評論使用scrapy

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 


class MySpider(BaseSpider): 
    name = "webmd" 
    allowed_domains = ["webmd.com"] 
    start_urls = ["http://www.webmd.com/drugs/drugreview-92884-Boniva"] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.select("//p") 
     title = titles.select("//p[contains(@class, 'comment')and contains(@style, 'display:none')]/text()").extract() 
     print(title) 

執行這段代碼給了我想要的輸出,但有很多重複,即相同的意見都至少重複做10倍。 幫我解決這個問題。

回答

3

你可以重寫你的蜘蛛像這樣的代碼:

import scrapy 

# Your Items 
class ReviewItem(scrapy.Item): 
    review = scrapy.Field() 


class WebmdSpider(scrapy.Spider): 
    name = "webmd" 
    allowed_domains = ["webmd.com"] 
    start_urls = ['http://www.webmd.com/drugs/drugreview-92884-Boniva'] 

    def parse(self, response): 
     titles = response.xpath('//p[contains(@id, "Full")]') 
     for title in titles: 
      item = ReviewItem() 
      item['review'] = title.xpath('text()').extract_first() 
      yield item 

     # Checks if there is a next page link, and keeping parsing if True  
     next_page = response.xpath('(//a[contains(., "Next")])[1]/@href').extract_first() 
     if next_page: 
      yield scrapy.Request(response.urljoin(next_page), callback=self.parse) 

它只選擇滿顧客評論沒有重複和Scrapy Items保存它們。 注:而不是HtmlXPathSelector你可以使用更方便的快捷方式response。另外,我更換棄用scrapy.BaseSpiderscrapy.Spider

爲了將評論保存爲csv格式,您可以簡單地使用Scrapy Feed exports並鍵入控制檯scrapy crawl webmd -o reviews.csv

+0

謝謝!!!它的工作原理... –

+0

很高興我能提供幫助。另外,您最好將不贊成使用的'scrapy.BaseSpider'更改爲'scrapy.Spider'。爲了節省評論,你可以使用[Scrapy Items](https://doc.scrapy.org/en/latest/topics/items.html)。 – vold

+0

你能幫我將評論保存在.csv文件中嗎?每個評論在不同的單元格。 –

2

您可以使用sets獲得獨特的評論。我希望你知道選擇器將結果作爲list返回,所以如果你使用集合,那麼你只會得到唯一的結果。所以

def parse(self,response): 
    hxs = HtmlXPathSelector(response) 
    titles = hxs.select("//p") 
    title = set(titles.select("//p[contains(@class, 'comment')and contains(@style, 'display:none')]/text()").extract()) 
    print (title) #this will have only unique results. 
+0

謝謝!有用... –