【爬虫实战】抓取某站评论
声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
方式一:JS逆向+request发送请求
效率更高,但逆向难度较大,此处不做讲解。
方式二:自动化模块(DrissionPage)发送请求
官方地址:https://www.drissionpage.cn/
安装
pip install DrissionPage
基础使用
创建页面驱动:ChromiumPage()
# 导入
from DrissionPage import ChromiumPage
# 创建对象
page = ChromiumPage()
请求网址:page.get(xxx)
# 创建对象
page = ChromiumPage()
# 访问网页
page.get('https://www.baidu.com')
监听后端接口:page.listen.start(xxx)
# 创建对象
page = ChromiumPage()
# 访问网页
page.get('https://www.baidu.com')
# 监听指定接口
page.listen.start("mcp/pc/pcsearch")
获取元素输入文本:page(‘#kw’).input(‘xxx’)
# 创建对象
page = ChromiumPage()
# 访问网页
page.get('https://www.baidu.com')
# 输入文本
page('#kw').input('DrissionPage')
点击按钮:page(‘#su’).click()
# 创建对象
page = ChromiumPage()
# 访问网页
page.get('https://www.baidu.com')
# 输入文本
page('#kw').input('DrissionPage')
# 点击按钮
page('#su').click()
获取页面元素:page.eles(‘tag:h3’)
page.eles('tag:h3')
等待页面返回数据:page.listen.wait()
rsp = page.listen.wait()
print(rsp.response.body['data'])
案例一:抓取页面元素
# 导入
from DrissionPage import ChromiumPage
# 创建对象
page = ChromiumPage()
# 访问网页
page.get('https://www.baidu.com')
# 输入文本
page('#kw').input('DrissionPage')
# 点击按钮
page('#su').click()
# 等待页面跳转
page.wait.load_start()
# 获取所有结果
links = page.eles('tag:h3')
# 遍历并打印结果
for link in links:
print(link.text)
案例二:抓取接口数据
- 创建对象
- 监听后端接口
- 访问网页触发接口请求
# 导入
from DrissionPage import ChromiumPage
# 创建对象
page = ChromiumPage()
page.listen.start("mcp/pc/pcsearch")
# 访问网页
page.get('https://www.baidu.com')
# 输入文本
page('#kw').input('DrissionPage')
# 点击按钮
page('#su').click()
rsp = page.listen.wait()
print(rsp.response.body['data'])
分析
①获取视频URL
我们先使用浏览器登录某站,然后随机点开一个视频,复制视频的URL地址
②定位评论接口
F12打开开发者工具,查看视频下方评论,搜索其中一个评论,然后刷新页面。
- 打开左侧搜索框
- 根据评论关键字定位接口
③解析接口返回
定位到接口以后查看Preview、Response,查看具体评论是在哪个结构体里
代码编写
注意:为了演示效果,这里只给出部分代码,关于评论翻页、以及评论下方的回复,大家可以自行研究。
# 导入
from DrissionPage import ChromiumPage
# 创建对象
page = ChromiumPage()
page.listen.start("/x/v2/reply/wbi/main")
# 视频地址
page.get('https://www.bilibili.com/video/BV1rhDdYoEtf/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=abb9b9c7b77084f9624561bf945aee4a')
rsp = page.listen.wait()
# print(rsp.response.body['data'])
for index in range (len(rsp.response.body['data']['replies'])):
comment = rsp.response.body['data']['replies'][index]
text = comment['content']['message']
uname = comment['member']['uname']
print(uname + ':' + text)
效果: