用python抓取javascript生成的html

IT技术 javascript python browser screen-scraping
2021-01-27 06:30:19

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

5个回答

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

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

感谢您的洞察力,请求库可以做到吗?它适用于对服务器的 AJAX 请求,但我想知道它是否也适用于创建 HTML 的 javascript。不过,我在他们的文档中没有找到任何此类内容。
2021-03-16 06:30:19
有没有办法通过请求和美丽的汤本身来做到这一点?我一直在使用请求,它在其他所有情况下都可以正常工作,但这个。请让我知道请求是否也可以解决这个问题。
2021-03-28 06:30:19
@Shaardool:解决什么问题?抓取由 JavaScript 在浏览器中生成的 HTML?不 - 为此,您需要运行 JavaScript 的东西,以便它可以生成 HTML。Beautiful Soup 不运行 JavaScript。
2021-04-03 06:30:19
@Shaardool 我不熟悉请求库。通过提出一个专门关于该库的新问题,您可能会更快地得到答案。
2021-04-04 06:30:19

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

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

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

所以这就是你要做的:

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

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

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

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

我使用 webkit,它是 Chrome 和 Safari 背后的浏览器渲染器。通过 Qt 到 webkit 的 Python 绑定这是执行 JavaScript 并提取最终 HTML的完整示例

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

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