Gigya API 可以获取隐藏评论,但不能获取可见评论

Gigya API can get hidden comments but not the visible one

当我试图解析来自 JavaScript 书面网站的数据时,我遇到了一个非常奇怪的问题。可能因为我不是网络开发专家。

事情是这样的:

我正在尝试从 The Globe and Mail 获取所有评论数据。查看它的源码,没有办法使用Python,从源码解析评论数据,全部写在JavaScript.

不过,有个神器叫"Gigya"API,它可以return一个JS写的网站的所有评论。 Gigya getComments method

当我在Python Scrapy Spider中使用这些代码行时,它可以return所有评论。

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 日之前发布的所有评论目前都已在网上隐藏。这就是为什么在我在这里展示的 url 示例中,您只能看到 2 条评论,因为它们是在 11 月 28 日之后发布的。这 2 条新评论已添加新功能 - "React" 按钮.

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

我已经尝试了所有 Gigya 评论相关的方法,none 其中有效,其他 Gigya 方法,看起来没什么用...

有什么办法可以解决这个问题吗?

或者至少,你知道为什么,我可以得到所有隐藏的评论,但看不到具有新功能的新 commnets 吗?

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

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

  1. 首先,我在 Firefox 上安装了 Firebug,有了这个 Addon,我可以看到 HTML url的页面,很容易帮你找到内容,只需要在Firebug

  2. 中搜索关键词
  3. 然后我写了这样的代码:

    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中,成为可解析的。超级酷!