Python - 网页抓取动态网站
-
简述
在本章中,让我们学习如何在动态网站上执行网页抓取以及详细涉及的概念。 -
介绍
网页抓取是一项复杂的任务,如果网站是动态的,则复杂性会成倍增加。根据联合国对 Web 可访问性的全球审计,超过 70% 的网站本质上是动态的,它们的功能依赖于 JavaScript。 -
动态网站示例
让我们看一个动态网站的例子,并了解为什么它难以抓取。在这里,我们将以从名为http://example.webscraping.com/places/default/search 的网站进行搜索为例。但是我们怎么能说这个网站是动态的呢?可以从以下 Python 脚本的输出中判断,该脚本将尝试从上述网页中抓取数据 -输出
上面的输出显示示例爬虫未能提取信息,因为我们试图找到的 <div> 元素是空的。 -
从动态网站抓取数据的方法
我们已经看到,爬虫无法从动态网站上抓取信息,因为数据是使用 JavaScript 动态加载的。在这种情况下,我们可以使用以下两种技术从依赖于 JavaScript 的动态网站中抓取数据 -- 逆向工程 JavaScript
- 渲染 JavaScript
-
逆向工程 JavaScript
称为逆向工程的过程将很有用,让我们了解网页如何动态加载数据。为此,我们需要单击inspect element指定 URL 的选项卡。接下来,我们将点击NETWORK选项卡以查找对该网页发出的所有请求,包括路径为的 search.json/ajax. 无需从浏览器或通过 NETWORK 选项卡访问 AJAX 数据,我们也可以借助以下 Python 脚本来完成 -例子
上面的脚本允许我们使用 Python json 方法访问 JSON 响应。同样,我们可以下载原始字符串响应,并使用 python 的 json.loads 方法,我们也可以加载它。我们在下面的 Python 脚本的帮助下做到了这一点。它基本上会通过搜索字母“a”中的字母然后迭代 JSON 响应的结果页面来抓取所有国家/地区。运行上述脚本后,我们将得到以下输出,记录将保存在名为 countries.txt 的文件中。输出
-
渲染 JavaScript
在上一节中,我们对网页进行了逆向工程,了解 API 的工作原理以及我们如何使用它在单个请求中检索结果。但是,我们在进行逆向工程时可能会面临以下困难 --
有时网站可能非常困难。例如,如果网站是使用 Google Web Toolkit (GWT) 等高级浏览器工具制作的,那么生成的 JS 代码将是机器生成的,难以理解和逆向工程。
-
一些更高级别的框架,如React.js通过抽象已经很复杂的 JavaScript 逻辑,可以使逆向工程变得困难。
解决上述困难的方法是使用解析 HTML、应用 CSS 格式并执行 JavaScript 来显示网页的浏览器渲染引擎。例子
在这个例子中,为了渲染 Java Script,我们将使用熟悉的 Python 模块 Selenium。以下 Python 代码将在 Selenium 的帮助下呈现一个网页 -首先,我们需要从 selenium 导入 webdriver,如下所示 -现在,提供我们根据要求下载的网络驱动程序的路径 -现在,提供我们想要在现在由我们的 Python 脚本控制的 Web 浏览器中打开的 url。现在,我们可以使用搜索工具箱的 ID 来设置要选择的元素。接下来,我们可以使用 java 脚本来设置选择框内容如下 -以下代码行显示搜索已准备好在网页上单击 -下一行代码显示它将等待 45 秒以完成 AJAX 请求。现在,为了选择国家链接,我们可以使用 CSS 选择器,如下所示 -现在可以提取每个链接的文本以创建国家列表 - -