2016-10-22 26 views
0

我想抓取新闻文章和他们的评论与scrapy。就我而言,新闻文章及其评论位于不同的网页上,如以下示例所示。如何强制Scrapy刮掉文章网页后相应的评论网页?

(1)链接为一篇文章。 http://www.theglobeandmail.com/opinion/editorials/if-britain-leaves-the-eu-will-scotland-leave-britain/article32480429/

(2)与文章相关的评论的链接。 http://www.theglobeandmail.com/opinion/editorials/if-britain-leaves-the-eu-will-scotland-leave-britain/article32480429/comments/

我希望我的程序能够理解(1)和(2)是相关的。另外,我想确保(2)在(1)之后被抓取,而不是在中间抓取其他网页。我使用以下规则来刮取新闻文章的网页和评论网页。

rules = (
     Rule(LinkExtractor(allow = r'\/article\d+\/$'), callback="parse_articles"), 
     Rule(LinkExtractor(allow = r'\/article\d+\/comments\/$'), callback="parse_comments") 
) 

我试图在文章中解析函数的使用提出明确要求通话,如下图所示:

comments_url = response.url + 'comments/' 
print('comments url: ', comments_url) 
return Request(comments_url, callback=self.parse_comments) 

但没有奏效。如何在抓取文章网页后立即要求抓取工具评论网页?

回答

0

您需要手动设置对评论页面的请求。
您的爬虫搜索器发现的每篇文章页面都应该有某处的评论页面网址,对不对?
在这种情况下,您可以简单地链接parse_article()方法中的审阅页请求。

from scrapy import Request 
from scrapy.spiders import CrawlSpider 
class MySpider(CrawlSpider): 

    rules = (
     Rule(LinkExtractor(allow = r'\/article\d+\/$'), callback="parse_articles"), 
    ) 
    comments_le = LinkExtractor(allow = r'\/article\d+\/comments\/$') 

    def parse_article(self, response): 
     item = dict() 
     # fill up your item 
     ... 
     # find comments url 
     comments_link = comments_le.extract_links()[0].link 
     if comments_link: 
      # yield request and carry over your half-complete item there too 
      yield Request(comments_link, self.parse_comments, 
          meta={'item':item}) 
     else: 
      yield item 

    def parse_comments(self, response): 
     # retrieve your half-complete item 
     item = response.meta['item'] 
     # add some things to your item 
     ... 
     yield item 
+0

谢谢您的回复!它会转到相应的评论链接,但它仍然不会在文章页面后面留下评论页面。它刮擦了其间的其他物品。 – user7009553

+0

@ user7009553是的,因为scrapy是异步的,它会并行地扫描多个链。因此,它可能会刮掉文章并安排评论请求,同时刮掉其他一些文章 - 但是您的链条不会丢失订单。在这种情况下,你的链是parse_article-> parse_comments-> yield item,所以你应该得到你期望的结果。 – Granitosaurus