【问题标题】:Scraping items using scrapy使用 scrapy 抓取项目
【发布时间】:2017-04-15 07:11:37
【问题描述】:

我编写了以下爬虫,用于抓取 webmd 网站以供患者评论

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)

执行此代码给了我想要的输出,但有很多重复,即相同的 cmets 至少重复 10 次。 帮我解决这个问题。

【问题讨论】:

    标签: python xpath scrapy web-crawler scrapy-spider


    【解决方案1】:

    你可以像这样重写你的蜘蛛代码:

    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.BaseSpider 更改为scrapy.Spider

    要将评论保存为 csv 格式,您只需使用 Scrapy Feed exports 并在控制台中输入 scrapy crawl webmd -o reviews.csv

    【讨论】:

    • 很高兴能帮上忙。此外,您最好将已弃用的scrapy.BaseSpider 更改为scrapy.Spider。要保存抓取的评论,您可以使用Scrapy Items
    • 您能帮我将评论保存在 .csv 文件中吗?每个评论在不同的单元格中。
    • 有没有办法限制被抓取的评论数量?
    • 页面包含 153 条评论,每页显示 5 条评论。您需要 153 中的哪些数字?
    • 我只想要 100 条评论
    【解决方案2】:

    您可以使用sets 来获取唯一的 cmets。我希望您知道选择器以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.
    

    【讨论】:

      猜你喜欢
      • 2018-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多