0

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

这是发生的事情:

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

然而,有一个神奇的工具叫做“Gigya” API,它可以返回一个 JS 编写的网站的所有评论。Gigya getComments 方法

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

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 日之前发布的隐藏的数百条评论,但无法获得我们现在可以在网站上看到的新评论。

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

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

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

4

1 回答 1

0

最后,我用 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 页面中找不到的内容,直到您单击网站上的反应图像。使硒超级酷的就是这种click()方法。找到可以点击的元素后,只要使用这个方法,那些生成的元素就会出现在 HTML 中并变成可解析的。超酷!

于 2016-12-04T08:56:39.373 回答