使用Python抓取由JavaScript生成的HTML

18

我需要使用Python爬取一个网站。我通过urlib模块获取源HTML代码,但我还需要抓取由JavaScript函数生成的一些HTML代码(该函数包含在HTML源代码中)。这个函数在网站中的作用是,当你按下一个按钮时,它会输出一些HTML代码。如何使用Python代码“按下”此按钮?Scrapy能帮助我吗?我使用Firebug捕获了POST请求,但当我试图将其传递到URL上时,我遇到了403错误。有什么建议吗?


我在如何在Python中点击JavaScript链接?上回答了一个类似的问题。 - sw.
这个回答解决了你的问题吗?使用Python爬取带有JavaScript的网页 - ggorlen
5个回答

11

在Python中,我认为要使用Selenium 1.0。它是一个库,可以让你用自己喜欢的语言控制真实的网页浏览器。

你需要在脚本运行的机器上安装对应的网络浏览器,但这是最可靠的编程方式来访问使用大量JavaScript的网站。


1
有没有办法使用requests和beautiful soup本身来完成这个任务?我一直在使用requests,在其他情况下都很好用,但是在这种情况下不行。请告诉我是否可以使用requests解决这个问题。 - Shaardool
@Shaardool:解决什么问题?爬取由 JavaScript 在浏览器中生成的 HTML?不行——你需要运行 JavaScript 的工具才能生成 HTML。Beautiful Soup 无法运行 JavaScript。 - Paul D. Waite
谢谢您的见解,Requests库可以做到吗?它在与服务器的AJAX请求方面表现良好,但我想知道它是否可以与创建HTML的JavaScript一起使用。尽管我在他们的文档中没有找到这样的东西。 - Shaardool
@Shaardool 我不熟悉Requests库。你最好提出一个关于该库的新问题,这样很可能会更快得到答案。 - Paul D. Waite

11

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

要爬取JS渲染的页面,我们需要一个支持JavaScript引擎(即支持JavaScript渲染)的浏览器。

Mechanizeurl2lib这样的选项将无法工作,因为它们不支持JavaScript。

所以你需要这么做:

设置PhantomJSSelenium一起运行。在安装了它们的依赖关系之后(参考这个),您可以使用以下代码示例来获取完全呈现的网站。

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()

4

我之前(在.NET中)也做过这件事,基本上你需要托管一个浏览器,让它点击按钮,然后通过对浏览器的DOM(文档对象模型)进行查询来获取生成的HTML。

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


3

2
对于伟大的 Python 网页抓取框架 Scrapy,有一个名为 scrapyjs 的附加下载器处理程序/中间件处理程序,能够抓取 JavaScript 生成的内容。
它基于 pygtk、python-webkit 和 python-jswebkit 中的 WebKit 引擎,非常简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接