【问题标题】:Gigya API can get hidden comments but not the visible oneGigya API 可以获取隐藏评论,但不能获取可见评论
【发布时间】:2016-12-04 16:56:39
【问题描述】:

我在尝试解析来自 JavaScript 编写的网站的数据时遇到了一个非常奇怪的问题。也许是因为我不是网络开发专家。

这是发生了什么:

我正在尝试从The Globe and Mail 获取所有 cmets 数据。如果你查看它的源代码,没有办法使用 Python 并从源代码中解析出 cmets 数据,一切都是用 JavaScript 编写的。

但是,有一个神奇的工具叫做“Gigya”API,它可以从一个JS编写的网站返回所有的cmets。 Gigya getComments method

当我在 Python Scrapy Spider 中使用这些代码行时,它可以返回所有的 cmets。

data = {"categoryID": self.categoryID,
                "streamID": streamId,
                "APIKey": self.apikey,
                "callback": "foo",
                "threadLimit": 1000   # assume all the articles have no more then 1000 comments
                }
r =   urlopen("http://comments.us1.gigya.com/comments.getComments", data=urlencode(data).encode("utf-8"))
comments_lst = loads(r.read().decode("utf-8"))["comments"]

然而,环球邮报正在更新他们的网站,所有在 11 月 28 日之前发布的 cmets 都暂时从网络上隐藏了。这就是为什么在我在这里展示的示例网址上,您只能看到 2 个 cmets,因为它们是在 11 月 28 日之后发布的。这两个新 cmets 已添加了新功能 - “React”按钮。

奇怪的是,现在当我运行我的代码时,我可以得到所有在 11 月 28 日之前发布的隐藏的数百个 cmets,但无法获得我们现在可以在网站上看到的新 commnet。

我已经尝试了所有与 Gigya 评论相关的方法,但没有一个有效,其他 Gigya 方法,看起来没有帮助......

有没有办法解决这个问题?

或者至少,你知道为什么,我可以获取所有隐藏的 cmets,但无法获取具有新功能的可见新 commnet?

【问题讨论】:

    标签: python-3.x parsing web gigya


    【解决方案1】:

    最后,我用 Python selenium 库解决了这个问题,它是免费的,而且超级酷。

    所以,看起来虽然在JS编写的网站的源代码中,我们看不到内容,但实际上是有可以解析内容的HTML页面。

    1. 首先,我在火狐上安装了Firebug,通过这个插件,我可以看到url的HTML页面,并且很容易帮你定位到内容,只需在 Firebug 中搜索关键字

    2. 然后我这样写代码:

      from selenium import webdriver
      import time
      def main():
      comment_urls = [
      "http://www.theglobeandmail.com/opinion/a-fascists-win-americas-moral-loss/article32753320/comments/"
                 ]
      
      for comment_url in comment_urls:
          driver = webdriver.Firefox()
          driver.get(comment_url)
          time.sleep(5)
          htmlSource = driver.page_source
          clk = driver.find_element_by_css_selector('div.c3qHyJD')
          clk.click()
          reaction_counts = driver.find_elements_by_class_name('c2oytXt')
          for rc in reaction_counts:
              print(rc.text)
      
      if __name__ == "__main__":
          main()
      

    我在这里解析的数据是那些在你点击网站上的反应图片之前无法在 HTML 页面中找到的内容。使 selenium 超级酷的是 click() 方法。找到可以点击的元素后,只要使用这个方法,那些生成的元素就会出现在 HTML 中,变成可解析的。超级酷!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多