动态网页抓取( 不能动态加载的内容静态网页的两种方法 )

优采云 发布时间: 2022-03-13 17:26

  动态网页抓取(

不能动态加载的内容静态网页的两种方法

)

  一、动态网页爬取介绍

  在很多网站中,使用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. 安装硒

  点安装硒

  下载“geckodriver”并位于 Python 的安装目录中。

  

  2. 使用 selenium 爬取数据

  第 1 步:找到评论的 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']"))

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线