java爬虫抓取动态网页( 全球互联网可访问性审计报告,说明什么是JavaScript逆向工程)
优采云 发布时间: 2021-11-05 00:18java爬虫抓取动态网页(
全球互联网可访问性审计报告,说明什么是JavaScript逆向工程)
解析动态内容
根据权威机构发布的全球互联网无障碍审计报告,全球约四分之三的网站是通过JavaScript动态生成的,即在浏览器窗口中“查看网页”。在 HTML 代码中找不到“源代码”,这意味着我们用来获取数据的方法无法正常工作。解决这个问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。
JavaScript 逆向工程
我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓的 JavaScript 逆向工程就是通过 Ajax 技术找到一个接口来动态获取数据。在浏览器中输入,打开“360图片”的“美女”版块,如下图。
但是当我们在浏览器中使用右键菜单“显示网页源代码”时,我们惊讶地发现页面的HTML代码连接到一个
没有标签,那么我们看到的图片是如何显示的呢?原来所有的图片都是通过JavaScript动态加载的,获取这些图片数据的web API接口可以在浏览器“开发者工具”的“网络”中找到,如下图所示。
那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发过程中,我们可能需要分析这些接口的参数以及接口返回的数据,了解每个参数的含义以及返回的JSON数据的格式,这样我们才能在我们的程序中使用这些数据履带。
如何从web API中获取JSON格式的数据,提取出我们需要的内容,在之前的“文件与异常”一文中已经说明,这里不再赘述。
使用硒
虽然很多网站保护了自己的web API接口,增加了获取数据的难度,但只要足够努力,大部分都是可以逆向工程的,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是使用的渲染引擎。
WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,苹果从该项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中。早期的 Chrome 浏览器也使用了这个内核。在Python中,我们可以通过Qt框架获取WebKit引擎,用它来渲染页面,获取动态内容。此内容请阅读《爬虫技术:动态页面抓取超级指南》一文。
如果你不打算使用上述方法来渲染页面和获取动态内容,其实还有一个选择就是使用自动化测试工具Selenium,它提供了浏览器自动化的API接口,这样你就可以通过操纵浏览器内容获得动态。首先,您可以使用 pip 安装 Selenium。
pip3 install selenium
下面以《阿里V任务》的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播图片。
import requestsfrom bs4 import BeautifulSoupdef main(): resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang') soup = BeautifulSoup(resp.text, 'lxml') for img_tag in soup.select('img[src]'): print(img_tag.attrs['src'])if __name__ == '__main__': main()
运行上面的程序会发现没有输出,因为根本找不到页面的HTML代码
标签。接下来我们使用Selenium获取页面上的动态内容,然后提取锚点图片。
from bs4 import BeautifulSoupfrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysdef main(): driver = webdriver.Chrome() driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang') soup = BeautifulSoup(driver.page_source, 'lxml') for img_tag in soup.body.select('img[src]'): print(img_tag.attrs['src'])if __name__ == '__main__': main()
在上面的程序中,我们使用 Selenium 来控制 Chrome 浏览器。如果你想控制其他浏览器,可以创建相应的浏览器对象,如Firefox、IE等。 运行上面的程序,如果看到如下所示的错误信息,说明我们还没有添加Chrome浏览器驱动PATH环境变量,我们也没有在程序中指定Chrome浏览器驱动的位置。
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
为了解决以上问题,可以到Selenium官方网站找到浏览器驱动的下载链接,下载需要的驱动。Linux或者macOS下可以使用下面的命令设置PATH环境变量,Windows下配置环境变量也很简单,不明白的可以看懂。
export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
其中/Users/Hao/Downloads/Tools/chromedriver/是chromedriver所在的路径。