刮文章网页后如何强制刮相应的评论网页?

2024-04-26 23:49:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着抓取新闻文章和他们的评论与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)

但没用。我怎么能要求爬虫刮评论网页后,立即刮文章网页?你知道吗


Tags: comhttpurl网页parse链接wwwcallback
1条回答
网友
1楼 · 发布于 2024-04-26 23:49:48

您需要手动设置对评论页的请求。
爬行蜘蛛发现的每个文章页面都应该在某个地方有一个评论页面url,对吗?
在这种情况下,您可以简单地在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

相关问题 更多 >