【问题标题】:Retrieving comments (disqus) embedded in another web page with python使用python检索嵌入在另一个网页中的评论(disqus)
【发布时间】:2016-09-24 12:35:46
【问题描述】:

我正在使用 python 3.5 (Beautifulsoup) 废弃一个网站。我可以阅读源代码中的所有内容,但我一直试图从 disqus 中检索嵌入式 cmets,但没有成功(这是对脚本的引用)。

这段 html 代码源如下所示:

var disqus_identifier = "node/XXXXX";
script type='text/javascript' src='https://disqus.com/forums/siteweb/embed.js';

src 发送到脚本函数。

我已经阅读了 stackoverflow 中的建议,使用 selenium,但我很难让它工作但没有成功。我知道 selenium 模拟浏览器(我认为这对我想要的来说太重了)。但是,我的 webdrivers 有问题,它不能正常工作。所以,我放弃了这个选项。

我希望能够执行脚本并使用 cmets 检索 .js。 我发现一个可能的解决方案是 PyV8。但我无法在 python 中导入。 我在互联网上阅读了帖子,我用谷歌搜索了它,但它不起作用。

我安装了 Sublime Text 3 并手动下载了 pyv8-win64-p3:

C:\Users\myusername\AppData\Roaming\Sublime Text 3\Installed Packages\PyV8\pyv8-win64-p3

但我不断得到:

ImportError: 没有名为“PyV8”的模块。

如果有人可以帮助我,我将非常感谢。

【问题讨论】:

  • 我找到了一种方法。我足以构建指向嵌入框架的 url(在 java 脚本中完成的事情之一)并解析它。

标签: javascript python web-scraping pyv8


【解决方案1】:

因此,您可以通过研究其网络流量来构建 Disqus API;在页面源中存在所有必需的数据。像 Disqus API 发送一些查询字符串。最近我从 Disqus API 中提取了 cmets,这里是示例代码。

示例: 这里汤-页面源和params_dict = json.loads(str(soup).split("embedVars = ")[1].split(";")[0])

def disqus(params_dict,soup):
    headers = {
    'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0'
    }
    comments_list = []
    base = 'default'
    s_o = 'default'
    version = '25916d2dd3d996eaedf6cdb92f03e7dd'
    f = params_dict['disqusShortname']
    t_i = params_dict['disqusIdentifier']
    t_u = params_dict['disqusUrl']
    t_e = params_dict['disqusTitle']
    t_d = soup.head.title.text
    t_t = params_dict['disqusTitle']
    url = 'http://disqus.com/embed/comments/?base=%s&version=%s&f=%s&t_i=%s&t_u=%s&t_e=%s&t_d=%s&t_t=%s&s_o=%s&l='%(base,version,f,t_i,t_u,t_e,t_d,t_t,s_o)
    comment_soup = getLink(url)
    temp_dict = json.loads(str(comment_soup).split("threadData\" type=\"text/json\">")[1].split("</script")[0])
    thread_id = temp_dict['response']['thread']['id']
    forumname = temp_dict['response']['thread']['forum']
    i = 1
    count = 0
    flag = True
    while flag is True:
        disqus_url = 'http://disqus.com/api/3.0/threads/listPostsThreaded?limit=100&thread='+thread_id+'&forum='+forumname+'&order=popular&cursor='+str(i)+':0:0'+'&api_key=E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F'
        comment_soup = getJson(disqus_url)

它将返回 json,您可以在其中找到可以提取 cmets 的 cmets。希望这对您有所帮助。

【讨论】:

  • 谢谢@RamenChef,我用过。我正在尝试为 Facebook cmets 做同样的事情,但如何获取 api 的密钥则不太清楚。你对此有什么想法吗?我想避免使用 Facebook 的 API 来获取令牌(这需要拥有 FB 帐户)。
  • 所以,@pacode 你可以通过监控网络获取 API 密钥。
【解决方案2】:

对于 Facebook 嵌入式 cmets,您可以使用 Facebook 的 graph api 提取 json 格式的 cmets。

例子-

Facebook cmets - https://graph.facebook.com/comments/?ids= "link of page"

【讨论】:

  • 感谢@Prashant 的回答。显然这个解决方案不再可用。需要一个令牌。我收到消息:“消息”:“请求此资源需要访问令牌。”。我认为在 2011 年到 2015 年之间,api 发生了变化。
  • 我仍在解决这个问题,我现在可以完全按照您的建议去做。我可以恢复 url 的 id(查看 Facebook 插件放置 cmets 的框架上的 html coude 源代码)。在 Graph API 中插入此代码时,如下所示:comments/?ids=[found_id] 是否可以检索此 id 或指向插件指向的 url?谢谢你的灯!
  • 所以我找到了解决方案。这是您可以使用 FB API 令牌提取 fb 数据的新链接。-https://graph.facebook.com/849499125131056/comments/?access_token=[FB_Access Token] 。(对于 id,您可以研究页面的网络)。尝试单击页面上 Facebook 插件的排序下拉框。现在您可以通过查看网络来获取页面 ID。希望这会正常工作.. @pacode
  • 是的,谢谢。实际上我已经按照您之前的建议进行了操作,并且能够从网络中恢复 id。我现在的问题是:给定一个具有嵌入式框架(插件 facebook)的 url,它显示 facebook cmets,我该如何检索这个 id?在您的示例中,我从 api 获得:{ "created_time": "2015-05-11T21:47:48+0000", "title": "Olivia Palermo x Ciaté Collection", "type": "article", "id": "849499125131056"},当然还有 cmets。那么,我怎么知道这个 id 来自哪个 url?做类似 graph.com/id=url/cmets 的事情可以吗?
  • @pacode 所以,每个有 Facebook 页面的 URL,都有一个我在谈论的节点 ID。所以你只需转到要提取 FB cmets 的那个页面。尝试单击排序下拉页面上 Facebook 插件的下拉框。现在您可以通过查看网络来获取页面的唯一节点 ID。执行上述步骤时网络中的示例链接-https://www.facebook.com/plugins/comments/async/849499125131056/pager/social/?dpr=1..您可以在其中提取 id 然后放入我之前共享的上述链接。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多