python抓取动态网页(什么是HTML源码中的JS动态生成?(一))
优采云 发布时间: 2021-11-24 09:17python抓取动态网页(什么是HTML源码中的JS动态生成?(一))
我们之前抓取的网页大多是 HTML 静态生成的内容。您可以直接从 HTML 源代码中找到您看到的数据和内容。然而,并不是所有的网页都是这样。
网站的部分内容是前端JS动态生成的。由于网页呈现的内容是由JS生成的,我们可以在浏览器上看到,但是在HTML源代码中是找不到的。 例如,今天的头条新闻:
浏览器渲染的网页如下图所示:
查看源码,却是如下图:
网页上的新闻在HTML源代码中找不到,都是JS动态生成和加载的。
在这种情况下,我们应该如何抓取网页?有两种方式:
从网页响应中查找JS脚本返回的JSON数据;
使用 Selenium 模拟访问网页
这里只介绍第一种方法。关于Selenium的使用有专门的文章。
一、从网页响应中查找JS脚本返回的JSON数据
即使网页内容是由JS动态生成和加载的,JS也需要调用一个接口,根据接口返回的JSON数据进行加载和渲染。
这样我们就可以找到JS调用的数据接口,从数据接口中找到网页最后呈现的数据。
以今日头条为例说明:
1、找到JS请求的数据接口
F12 打开网页调试工具
网页调试工具
选择“网络”选项卡后,我们发现有很多响应。让我们过滤它们,只查看 XHR 响应。 (XHR 是 Ajax 中的一个概念,意思是 XMLHTTPrequest)
然后我们发现很多链接都没有了,随便点一个看看:
我们选择city,预览中有一串json数据:
让我们再次点击打开它:
原来都是城市列表,应该用来加载地区新闻。
现在你应该明白如何找到JS请求的接口了吧?但是刚才没有找到想要的消息,所以再找一下:
有个焦点,我们点一下看看:
首页图片新闻呈现的数据是一样的,所以数据应该是有的。
查看其他链接:
这应该是热搜关键词
返回一串乱码,但从响应中看到的是正常编码的数据:
有了对应的数据接口,我们就可以模仿前面的方法向数据接口请求并得到响应
2、请求解析数据接口数据
先上传完整代码:
# 编码:utf-8
导入请求
导入json
url ='#39;
wbdata = requests.get(url).text
data = json.loads(wbdata)
news = data['data']['pc_feed_focus']
对于新闻中的 n:
title = n['title']
img_url = n['image_url']
url = n['media_url']
打印(网址,标题,img_url)
返回结果如下:
像往常一样,稍微解释一下代码:
代码分为四部分,
第 1 部分:导入相关库
# 编码:utf-8
导入请求
导入json
第 2 部分:向数据接口发出 http 请求
url ='#39;
wbdata = requests.get(url).text