用python抓取javascript生成的html

Posted

技术标签:

【中文标题】用python抓取javascript生成的html【英文标题】:scrape html generated by javascript with python 【发布时间】:2011-01-10 01:08:42 【问题描述】:

我需要用 python 抓取一个网站。我使用 urllib 模块获取了源 html 代码,但我还需要抓取一些由 javascript 函数(包含在 html 源代码中)生成的 html 代码。这个函数在站点“中”的作用是,当您按下按钮时,它会输出一些 html 代码。如何用 python 代码“按下”这个按钮?刮痧能帮到我吗?我用 firebug 捕获了 POST 请求,但是当我尝试在 url 上传递它时,我收到 403 错误。有什么建议吗?

【问题讨论】:

我在Click on a javascript link within python?回答了一个类似的问题 这能回答你的问题吗? Web-scraping JavaScript page with Python 【参考方案1】:

由于这里没有全面的答案,我先写一个。

要刮掉 JS 渲染的页面,我们需要一个具有 JavaScript 引擎的浏览器(即支持 JavaScript 渲染)

Mechanizeurl2lib 等选项将不起作用,因为它们支持 JavaScript。

所以这就是你要做的:

将PhantomJS 设置为与Selenium 一起运行。在为它们安装了依赖项之后(参考this),您可以使用以下代码作为示例来获取完全呈现的网站。

from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get('http://jokes.cc.com/')
soupFromJokesCC = BeautifulSoup(driver.page_source) #page_source fetches page after rendering is complete
driver.save_screenshot('screen.png') # save a screenshot to disk

driver.quit()

【讨论】:

【参考方案2】:

对于Scrapy(伟大的python抓取框架)有scrapyjs:一个额外的下载器处理程序/中间件处理程序能够抓取javascript生成的内容。

它基于pygtk、python-webkit和python-jswebkit的webkit引擎,非常简单。

【讨论】:

【参考方案3】:

我使用 webkit,它是 Chrome 和 Safari 背后的浏览器渲染器。有Python bindings to webkit through Qt。这是完整的example to execute JavaScript and extract the final HTML。

【讨论】:

【参考方案4】:

在 Python 中,我认为 Selenium 1.0 是要走的路。它是一个库,可让您从您选择的语言控制真正的网络浏览器。

您需要在运行脚本的机器上安装有问题的网络浏览器,但这似乎是以编程方式询问使用大量 JavaScript 的网站的最可靠方法。

【讨论】:

有没有办法通过请求和美丽的汤本身来做到这一点?我一直在使用请求,除此之外,它在其他所有情况下都可以正常工作。请让我知道 requests 是否也可以解决这个问题。 @Shaardool:解决什么问题?抓取由 JavaScript 在浏览器中生成的 HTML?不——因为你需要运行 JavaScript 的东西才能生成 HTML。 Beautiful Soup 不运行 JavaScript。 感谢您的见解,请求库可以做到吗?它适用于对服务器的 AJAX 请求,但我想知道它是否也适用于创建 HTML 的 javascript。不过,我在他们的文档中没有找到任何这样的东西。 @Shaardool 我不熟悉 Requests 库。通过专门针对该库提出一个新问题,您可能会更快地得到答案。【参考方案5】:

我以前必须这样做(在 .NET 中),您基本上必须托管一个浏览器,让它点击按钮,然后询问浏览器的 DOM(文档对象模型)以获取生成的 HTML。

这绝对是 Web 应用程序转向 Ajax/Javascript 方法来生成 HTML 客户端的缺点之一。

【讨论】:

以上是关于用python抓取javascript生成的html的主要内容,如果未能解决你的问题,请参考以下文章

用于 javascript 生成内容的 Python 网页抓取

用 C# 抓取 JavaScript 生成的网页

将 Javascript 生成的表上的 <td> 值抓取到 Python

如何用python抓取js生成的数据

如何抓取 HTTPS javascript 网页

网页抓取具有动态 javascript 内容的网站