【问题标题】:Can I extract comments of any page from https://www.rt.com/ using python3?我可以使用 python3 从 https://www.rt.com/ 提取任何页面的评论吗?
【发布时间】:2016-12-01 03:24:28
【问题描述】:

我正在编写一个网络爬虫。我提取了这个link 的标题和主要讨论,但我找不到任何评论(Ctrl+u -> Ctrl+f。评论文本)。我认为 cmets 是用 JavaScript 编写的。我可以提取它吗?

【问题讨论】:

    标签: javascript python beautifulsoup web-crawler


    【解决方案1】:

    是的,如果可以用网络浏览器查看,就可以解压了。

    如果您查看源代码,它实际上是一个加载一段 javascript 的 iframe,然后在文档中创建一个新标签,其中该脚本标签的源代码加载 bundle.js,其中确实包含评论软件。然后依次获取实际的 cmets。

    您可以考虑使用例如 webkit 创建一个像普通浏览器一样执行 javascript 的无头浏览器,而不是手动执行此操作。然后您可以从中抓取,而不必手动让您的爬虫获取外部资源。

    这种无头浏览器的示例可能是 SpynnerDryscape 或 PhantomJS 派生的 PhantomPy(后者现在似乎是一个废弃的项目)。

    【讨论】:

    • 我看到了document,"//www.spot.im/launcher/bundle.js");,但文件在哪里?我可以进入该文件以提取 cmets 吗?
    • 您需要从 URL 下载文件 - 您的浏览器会自动执行此操作,因为它引用为 iframe 的 src。 cmets 不直接存储在该文件中,因此您无法从那里提取 cmets。它只是处理 cmets 的代码。
    • 你能给我参考一些提取像 cmets 这样的东西的例子吗?有教程或代码吗?我想知道怎么做?
    • 这实际上非常简单,因为您无需在页面上单击任何内容或“执行”某些操作即可显示 cmets。所以基本上你只需加载 URL,然后基于标准的 CSS 选择器,提取你需要的文本。你可以在这里看到一个例子Spynner,它只是几行代码,但是处理了一个更复杂的情况,你需要点击一些东西来使文本出现。
    【解决方案2】:

    RT 正在为 cmets 使用来自 spot.im 的服务

    你需要做两个 POST 请求,首先https://api.spot.im/me/network-token/spotim 获取令牌,然后https://api.spot.im/conversation-read/spot/sp_6phY2k0C/post/353493/get 获取 JSON 格式的 cmets。

    为此我编写了一个快速脚本

    import requests
    import re
    import json
    
    def get_rt_comments(article_url):
        spotim_spotId = 'sp_6phY2k0C' # spotim id for RT
        post_id = re.search('([0-9]+)', article_url).group(0)
    
        r1 = requests.post('https://api.spot.im/me/network-token/spotim').json()
        spotim_token = r1['token']
    
        payload = {
            "count": 25, #number of comments to fetch
            "sort_by":"best",
            "cursor":{"offset":0,"comments_read":0},
            "host_url": article_url,
            "canonical_url": article_url
        }
    
        r2_url ='https://api.spot.im/conversation-read/spot/' + spotim_spotId + '/post/'+ post_id +'/get'
        r2 = requests.post(r2_url, data=json.dumps(payload), headers={'X-Spotim-Token': spotim_token , "Content-Type": "application/json"})
    
        return r2.json()
    
    if __name__ == '__main__':
        url = 'https://www.rt.com/usa/353493-clinton-speech-affairs-silence/'
        comments = get_rt_comments(url)
        print(comments)
    

    【讨论】:

    • 我可以提出这两个请求来抓取任何 javascript 材料吗?
    • 你不需要担心javascript,上面的方法会给你JSON格式的cmets(这是浏览器中的javascript用来显示cmets的数据)。尝试运行脚本
    • 1.它返回了一个 json。 comment.text 不是一种方法。 2. 我想从http://www.aljazeera.com/ 做同样的事情(评论提取)。我读到了 phantomjs 和 phantompy。我可以将它们用于此目的吗?
    • 它返回的是 JSON 格式的 cmets,你只需要从中选择你想要的属性,例如,如果你想要评论文本,你可以做 [comment['content'][0]['text'] for comment in comments['comments']]。如果要从多个站点提取数据,则需要为每个站点编写一个单独的提取器,而您可以使用 phantomjs(或任何其他无头浏览器),查找正在发出的 Web 请求将更加有效和高效浏览器并复制这些。就 aljazera 而言,每篇文章都有一个用于 cmets 的 RSS 提要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多