相关文章推荐
爱听歌的草稿本  ·  Oracle GraalVM ...·  1 月前    · 
憨厚的可乐  ·  BEA WORKSHOP 中的 AJAX 编程·  4 周前    · 
道上混的领结  ·  从多个文件上的grep搜索中获取最后一行开发者社区·  3 周前    · 
安静的包子  ·  JavaScript中onclick事件传递 ...·  6 天前    · 
骑白马的羽毛球  ·  2023年自治区普通高等教育专升本考试招生录 ...·  9 月前    · 
逃跑的土豆  ·  2024李梦娇常识公基历年真题精讲100题全 ...·  1 年前    · 
细心的打火机  ·  紧凑型SUV车型大全 - 车质网·  2 年前    · 
天涯  ·  幻想水浒传 - 知乎·  4 年前    · 
Code  ›  解析动态内容开发者社区
webkit 逆向工程 动态 javascript
https://cloud.tencent.com/developer/article/2075704
另类的电脑桌
2 年前
作者头像
润森
0 篇文章

解析动态内容

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 毛利学Python > 解析动态内容

解析动态内容

作者头像
润森
发布 于 2022-08-18 09:44:24
600 0
发布 于 2022-08-18 09:44:24
举报

解析动态内容

根据权威机构发布的全球互联网可访问性审计报告,全球约有四分之三的网站其内容或部分内容是通过JavaScript动态生成的,这就意味着在浏览器窗口中“查看网页源代码”时无法在HTML代码中找到这些内容,也就是说我们之前用的抓取数据的方式无法正常运转了。解决这样的问题基本上有两种方案,一是JavaScript逆向工程;另一种是渲染JavaScript获得渲染后的内容。

JavaScript逆向工程

下面我们以“360图片”网站为例,说明什么是JavaScript逆向工程。其实所谓的JavaScript逆向工程就是找到通过Ajax技术动态获取数据的接口。在浏览器中输入http://image.so.com/z?ch=beauty就可以打开“360图片”的“美女”版块,如下图所示。

但是当我们在浏览器中通过右键菜单“显示网页源代码”的时候,居然惊奇的发现页面的HTML代码中连一个 <img> 标签都没有,那么我们看到的图片是怎么显示出来的呢?原来所有的图片都是通过JavaScript动态加载的,而在浏览器的“开发人员工具”的“网络”中可以找到获取这些图片数据的网络API接口,如下图所示。

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

使用Selenium

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

WebKit的代码始于1998年的KHTML项目,当时它是Konqueror浏览器的渲染引擎。2001年,苹果公司从这个项目的代码中衍生出了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代码上根本找不到 <img> 标签。接下来我们使用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'])
 
推荐文章
爱听歌的草稿本  ·  Oracle GraalVM Enterprise Edition | Oracle 日本
1 月前
憨厚的可乐  ·  BEA WORKSHOP 中的 AJAX 编程
4 周前
道上混的领结  ·  从多个文件上的grep搜索中获取最后一行开发者社区
3 周前
安静的包子  ·  JavaScript中onclick事件传递数组参数时接收的是[object,object],需要转为字符串传递_onclick传数组
6 天前
骑白马的羽毛球  ·  2023年自治区普通高等教育专升本考试招生录取最低投档控制分数线确定 - 通知公告 - 新疆教育考试院
9 月前
逃跑的土豆  ·  2024李梦娇常识公基历年真题精讲100题全程班百度云网盘
1 年前
细心的打火机  ·  紧凑型SUV车型大全 - 车质网
2 年前
天涯  ·  幻想水浒传 - 知乎
4 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号