爬取B站用户和评论,并且按照条件进行抽奖
一、前言
这是我写的第一篇爬虫博客(所以写了挺多)。试了一下午,也就写成这样了。兄弟们能提出建议就非常好了,以后就按差不多的框架写(就是最近没啥时间写了)。
某赛尔号UP主出了个抽奖视频,我进去看了下,他说他每几个星期就会组织一次抽奖(评论太多,单单筛选就得半年,非常浪费时间),所以我作为群管理员(不干事的便宜管理),觉得应该帮UP抽奖,才对得起他。
抽奖规则就一个:评论区回复关键字
二、总思路
就这还思路,玩呢?
1.爬取需要的内容
爬取B站某视频下评论区的用户和评论
页面地址为:链接: https://www.bilibili.com/
爬取的评论:
2.整理数据并进行抽奖
会用到Pandas和Random库
学习链接: https://www.pypandas.cn/
三、爬虫
1. 选择库
爬虫的库有很多,想好自己要使用什么库来写是很重要的。考虑的因素有很多,比如运行速度,代码难度(静态网页,动态网页,反爬机制等)。我思考的就很简单,哪种简单写那个。因为我是初学,所以我抛开了运行速度,用了写起来比较简单的Selenium库
2. 引用库
import time # 做间隔
import csv # 存储数据
from selenium import webdriver
from bs4 import BeautifulSoup
import emoji # 去除恶心的表情
import re # 去除奇怪的字符和表情
3. 设置Selenium参数
# 设置浏览器后台执行
options=webdriver.ChromeOptions()
options.add_argument('headless') # 无头模式:设置浏览器后台运行(无界面状态)
#禁止图片和css的加载,来保证运行速度
prefs = {
"profile.managed_default_content_settings.images": 2,'permissions.default.stylesheet':2}
options.add_experimental_option("prefs", prefs)
driver=webdriver.Chrome(options=options) # 创建Chrome浏览器对象。打开浏览器窗口
4.爬取数据:
先打开网页:
url = 'https://www.bilibili.com/video/BV1P5411a7NF' # 打开网页
driver.get(url)
driver.maximize_window()# 窗口最大化
time.sleep(2) # 停止2秒加载网页
运行后,把代码一层一层剥开,发现并不能找到评论区代码(没有箭头)
需要下拉滚动条到评论区,以获取评论区的代码,一次即可(翻页后自动到评论区)
js = "window.scrollTo(0,1000)"
driver.execute_script(js) # 执行js命令
time.sleep(2)
再次运行,发现多了些小箭头,这样源代码就加载出来了
目前为止的代码(自己跟着试试):
import time
import csv
from selenium import webdriver
from bs4 import BeautifulSoup
import emoji
import re
options = webdriver.ChromeOptions()
options.add_argument('headless')
prefs = {
"profile.managed_default_content_settings.images": 2,'permissions.default.stylesheet':2}
options.add_experimental_option("prefs", prefs)
driver=webdriver.Chrome(options=options) # 创建Chrome浏览器对象。打开浏览器窗口
url = 'https://www.bilibili.com/video/BV1P5411a7NF' # 打开网页
driver.get(url)
driver.maximize_window()# 窗口最大化
time.sleep(2) # 停止2秒加载网页(时间按照网速和电脑运行速度决定)
js = "window.scrollTo(0,1000)"
driver.execute_script(js) # 执行js命令
time.sleep(1)
要爬的东西只有用户名和评论,一层层剥开分析
a标签,class=name
users = soup.find('div', class_='con').find_all_next('a', class_='name')
p标签,class=text
comments = soup.find('div', class_=