抓取动态网页(网页爬取动态加载的两种方法介绍及使用方法 )
优采云 发布时间: 2021-12-26 04:15抓取动态网页(网页爬取动态加载的两种方法介绍及使用方法
)
一、动态网页爬虫介绍
很多网站都是用javascript来写网站的,很多内容都不会出现在HTML源代码中,所以之前爬取静态网页的方法是无法使用的。有一种异步技术叫做AJAX,它的价值在于通过后台和服务器之间的少量数据变换实现网页的异步更新。换句话说,在不重新加载整个网页的情况下更新网页的某个部分。减少网页上重复内容的下载并节省流量。但是随之而来的麻烦是我们在HTML代码中找不到我们想要的数据。解决这种爬取动态加载的内容,有两种方法:
通过浏览器解析地址查看元素,使用Selenium模拟浏览器抓取二、解析真实地址并抓取
我们要的数据不是HTML,而是可以找到数据的真实地址。请求这个地址也可以找到你想要的数据,完成书中的例子。首先打开网站:这个网站是JS写的,鼠标右键,点击check。刷新页面,可以看到网页上的所有文件都加载完毕了。这个过程就是抓包的过程。然后,点击网络,找到收录
数据的文件,记住是json数据。
单击标题以查找真实地址。然后将请求发送到真实地址。
1.发送请求,获取数据
import requests
# 构建url
url = """https://api-zero.livere.com/v1/comments/list?callback=jQuery1124006805677727422466_1546902786995&limit=10&repSeq=4272904&requestPath=%2Fv1%2Fcomments%2Flist&consumerSeq=1020&livereSeq=28583&smartloginSeq=5154&_=1546902786997"""
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
r = requests.get(url, headers=headers)
print(r.text)
2.分析数据
要从json数据中提取注释,首先我们需要找到符合json格式的部分。然后,使用 json.loads 将字符串格式的响应体转换为 json 数据。然后,根据json数据的结构,可以从评论列表中提取comment_list。最后,通过for循环,将注释文本提取出来并打印出来。
import json
json_string = r.text
# 找到符合json格式的数据
json_string = json_string[json_string.find('{'): -2]
# 转换为json格式
json_data = json.loads(json_string)
comment_list = json_data['results']['parents']
for eachone in comment_list:
message = eachone['content']
print(message)
三、 通过selenium模拟浏览器爬行
一些网站对地址进行加密,使得一些变量无法分析。接下来,我们将使用第二种方法,使用浏览器渲染引擎。显示网页时直接使用浏览器解析HTML,应用CSS样式,执行JavaScript语句。这种方法会打开浏览器,加载网页,自动操作浏览器浏览各种网页,顺便抓取数据,把抓取动态网页变成抓取静态网页。我们可以使用selenium库来模拟浏览器完成爬取。Selenium 是一种用于 Web 应用程序测试的工具。直接在浏览器中运行,浏览器根据脚本代码自动进行点击、输入、打开、验证等操作。
1. 安装硒
pip 安装硒
下载'geckodriver'并在Python安装目录中。
2. 使用 selenium 爬取数据
第一步:找到评论的HTML代码标签。使用火狐浏览器,点击页面,找到标签,定位到评论数据
第二步:尝试获取一条评论数据,使用如下代码获取数据。
# 使用CSS选择器查找元素,找到class为'reply-content'的div元素
comment = driver.find_element_by_css_selector('div.reply-content')
# 通过元素的tag去寻找‘p’元素
content = comment.find_element_by_tag_name('p')
print(content.text)
还是有问题啊 网页打不开啊
也可能存在解析失败报错的情况,报错“Message: Unable to locate element: div.reply_content”。这是因为源码需要解析成iframe,需要添加下面这行代码。
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livere']"))