实战Python网络爬虫
上QQ阅读APP看书,第一时间看更新

8.4 Ajax动态数据抓取

如果使用Requests-HTML请求网页地址,相应的响应内容与开发者工具的Doc选项卡的响应内容是一致的。如果网页数据是通过Ajax请求并由JavaScript渲染到网页上,还需要使用Requests-HTML模拟Ajax请求来获取网页数据。

对于爬虫开发者来说,模拟Ajax请求是一件相当痛苦的事情,比如构建请求参数,请求参数的构建方式繁多而复杂,这非常考验开发者对网站的分析能力。以QQ音乐的歌手列表页为例,每位歌手的名字都是由Ajax加载到网页上,如图8-3所示。

图8-3 歌手信息分析

为了降低开发难度,Requests-HTML提供了Ajax加载功能,加载后的网页信息与开发者工具的Elements选项卡的网页信息是一致的。这个加载功能是通过调用谷歌的Chromium浏览器实现的,Chromium是谷歌为发展Chrome而开启的计划,它可以理解为Chrome的工程版或实验版,新功能都会率先在Chromium上实现,待验证后才会应用在Chrome上。

Ajax加载功能由render()方法实现,初次使用render()方法会自动下载Chromium浏览器,下载Chromium浏览器必须保证当前网络能正常访问谷歌首页,否则无法下载。此外,还可以直接下载Chromium浏览器,并将浏览器放置在C盘的用户文件夹,如图8-4所示。

图8-4 配置Chromium浏览器

在图8-4上的文件路径中,只有“000”是变化的,不同的电脑有不同的命名;而chrome-win32文件夹的命名也是固定的,该文件夹里存放了Chromium浏览器的相关文件和应用程序。如果是通过下载方式就无需手动配置文件路径,Requests-HTML会将下载后的Chromium浏览器自动配置到相应的文件路径,如图8-5所示。

图8-5 Chromium浏览器自动配置

完成了Chromium浏览器配置,可以编写以下代码来实现Requests-HTML的Ajax加载功能:

在PyCharm里运行上述代码,可以看到程序将歌手姓名逐一输出。虽然运行速度比模拟Ajax请求的速度较慢,但可以大大降低开发难度,运行结果如图8-6所示。

图8-6 运行结果