python抓取动态网页(JavaScript逆向工程如何从网络API中获取JSON格式的数据)

优采云 发布时间: 2022-03-24 11:00

  python抓取动态网页(JavaScript逆向工程如何从网络API中获取JSON格式的数据)

  解析动态内容

  根据权威机构发布的《全球互联网无障碍审计报告》,全球约四分之三的网站内容或部分内容是通过JavaScript动态生成的,这意味着“以一种在HTML代码中找不到浏览器窗口“源代码”,说明我们以前抓取数据的方式并不能正常工作。解决这样的问题基本上有两种方案,一种是JavaScript逆向工程;另一种是渲染 JavaScript 以获取渲染的内容。

  JavaScript 逆向工程

  我们以“360图片”网站为例来说明什么是JavaScript逆向工程。其实所谓JavaScript逆向工程就是通过Ajax技术找到动态获取数据的接口。在浏览器中输入打开“360图片”的“美颜”板块,如下图所示。

  [外链图片传输失败(img-ZRl9xYmn-75)(./res/image360-website.png)]

  但是当我们在浏览器中使用右键菜单“显示网页的源代码”时,我们惊奇地发现页面的HTML代码中有一个链接。

  没有标签,那么我们看到的图片是怎么出现的呢?原来所有的图片都是通过JavaScript动态加载的,在浏览器“开发者工具”的“网络”中可以找到获取这些图片数据的web API接口,如下图所示。

  [外链图片传输失败(img-XVAx1JK3-78)(./res/api-image360.png)]

  那么结论就很简单了。只要找到这些网络API接口,就可以通过这些接口获取数据。当然,在实际开发中,我们可能还需要对这些接口的参数和接口返回的数据进行分析,以了解各个参数的含义以及返回的 JSON 数据的格式,以便我们可以在我们的爬虫。

  如何从网络API中获取JSON格式的数据,提取出我们需要的内容,在上一篇《文件与异常》中已经说明,这里不再赘述。

  使用硒

  虽然很多网站保护了自己的网络API接口,增加了获取数据的难度,但大部分只要努力够就可以进行逆向工程,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit 是一个利用的渲染引擎。

  WebKit 的代码始于 1998 年的 KHTML 项目,当时它是 Konqueror 浏览器的渲染引擎。2001 年,Apple 从这个项目的代码中衍生出 WebKit,并将其应用到 Safari 浏览器中,早期的 Chrome 浏览器也使用了内核。在 Python 中,我们可以通过 Qt 框架获取 WebKit 引擎,并使用它来渲染页面以获取动态内容。此内容请阅读文章《爬虫技术:动态页面爬取超级指南》。

  如果你不打算使用上面的方法来渲染页面并获取动态内容,其实还有一种替代方法可以使用自动化测试工具 Selenium,它提供了浏览器自动化的 API 接口,这样你就可以通过操纵浏览器。内容。首先,您可以使用 pip 安装 Selenium。

  pip3 install selenium

  下面以“阿里巴巴V任务”的“直播服务”为例,演示如何使用Selenium获取动态内容和抓拍主播的画面。

  import requests

from bs4 import BeautifulSoup

def 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 BeautifulSoup

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

def 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所在的路径。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线