28.5月6日 项目: 登录B站爬取推荐和评论
上一节课中,我们简单的介绍了selenium库的使用。
项目:爬取B站首页推荐内容
准备活动
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Edge()
browser.maximize_window()
手动登录
由于B站登录检测较为严格,故本次使用手动登录。
browser.get('https://www.bilibili.com/')
time.sleep(30)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
代码等待30秒,等待期间手动点击登录并手机扫描二维码进行登录。
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 屏幕下滑,为了显示下方推荐视频。
开始爬取视频标题
其中有几个坑:
- 序号从13开始,13之前的序号XPATH格式和之后的不同。
- 爬取的过程中,有部分“广告”、“番剧”、“直播”。他们的XPATH也和一般的不同
- 测试后,每次翻页新增15个,故每15次翻一页
故爬取的时候,需要加上try,否则报错执行不成功。
注意!!,每次翻页新增15个,是全屏情况下的!。不同分辨率也会不一样。需要灵活修改
获取xpath的方式,上节课有描述,此处略
for i in range(13,101):
try:
title_e = browser.find_element(By.XPATH, '//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[' + str(i) + ']/div[2]/div[2]/div/h3/a')
print(str(i)+":"+title_e.text)
if i%15==0:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
except:
print(str(i)+":错误")
time.sleep(20)
存储为json格式
以上的执行结果应该是成功的,为了后续的词频分析,避免多次的无意义的爬取。需要将爬取结果用json存储。
引入json库
import json
设置变量,并将结果存储到变量
str_list=[]
for i in range(13,101):
try:
title_e = browser.find_element(By.XPATH, '//*[@id="i_cecream"]/div[2]/main/div[2]/div/div[1]/div[' + str(i) + ']/div[2]/div[2]/div/h3/a')
print(str(i)+":"+title_e.text)
str_list.append(title_e.text)
if i%15==0:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
except:
print(str(i)+":错误")
time.sleep(5)
将列表转成json格式
json_str = json.dumps(str_list, ensure_ascii=False, indent=4)
json_str = json.dumps(str_list, ensure_ascii=False, indent=4) 这行代码的作用是将 str_list 这个列表转换成一个格式化的、包含非ASCII字符的JSON字符串,并且每个级别缩进4个空格。这样的字符串通常用于生成更易于阅读和调试的JSON数据。
- str_list:这是要被转换成JSON字符串的Python对象,它应该是一个列表(list)。
- ensure_ascii=False:这个参数指定了在序列化对象时,是否所有的非ASCII字符都应该被转义成\uXXXX形式。默认情况下,ensure_ascii 是 True,意味着所有非ASCII字符都会被转义。如果设置为 False,那么序列化后的字符串将包含非ASCII字符,这在生成更易读的JSON字符串时很有用。
- indent=4:这个参数指定了序列化后的JSON字符串的缩进级别。如果 indent 是一个非负整数,那么序列化后的字符串将被格式化为一个美观的多行字符串,每个级别都会有指定数量的空格缩进。如果 indent 是 None(默认值),那么序列化后的字符串将是一个紧凑的单行字符串。
写入文件
# 将JSON字符串写入文件
with open('B站推荐.json', 'w', encoding='utf-8') as json_file:
json_file.write(json_str)
print("JSON数据已保存到B站推荐.json文件中。")
错误数据分析


结果json 分析

项目:爬取“【罗翔】我们为什么要读书?”前100条热门评论
注意:B站评论需要登录后才能查看,故必须使用之前学到的手动登录。
爬取评论信息是分析某些事件群体情绪和热点标签的重要手段。
本项目是为后续词频分析打好数据基础。
在之前的代码上进行修改
代码
此项目较为简单,过程略
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import json
browser = webdriver.Edge()
browser.maximize_window()
browser.get('https://www.bilibili.com/video/BV1BK411L7DJ/')
time.sleep(2)
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(30)
str_list=[]
for i in range(1,101):
title_e = browser.find_element(By.XPATH, '//*[@id="comment"]/div/div/div/div[2]/div[2]/div[' + str(i) + ']/div[2]/div[2]/div[3]/span')
print(str(i)+":"+title_e.text)
str_list.append(title_e.text)
if i%10==0:
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
time.sleep(10)
# 将列表转换为JSON格式的字符串
json_str = json.dumps(str_list, ensure_ascii=False, indent=4)
# 将JSON字符串写入文件
with open('B站评论.json', 'w', encoding='utf-8') as json_file:
json_file.write(json_str)
print("JSON数据已保存到B站评论.json文件中。")
结果


这两个项目,也体现了selenium库特点,简单但低效。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果