赞
踩
配置:
python3版本
selenium 库(如果没有就pip 安装)+ Chrome driver(根据自己的chrome浏览器版本找到对应的)我这里使用的是119版本。
Chrome driver版本查找:CNPM Binaries Mirror
如果上述网站没有对应的Chrome版本,可以到Chrome for Testing availability 找最新的Chrome driver版本。
数据提取:
这里使用的是xpath分离
- import requests
- import json
- import time
- # 伪造请求头
- from fake_useragent import UserAgent
- from selenium import webdriver
- ua = UserAgent()
目标网站:
首先打开检查,选择network(网络),刷新当前页面,通过size倒序,找到请求数据的接口
可以看到请求这个接口的返回数据是json格式
同时对这个接口的param参数进行分析不难看出,ps是每一页请求20条内容,pn是页数,经过测试,最大请求页数在30页。
我们这里先写入文件,后续可以根据个人需要写入excel表格或者数据库中
- # 页数不写死
- url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='
- header = {
- "User-Agent":ua.chrome,
- }
- # 打开准备写入文件 默认每次重写
- f = open("hot_bilibili3.txt",'w',encoding='utf-8')
-
-
- if __name__ == '__main__':
- # 启动浏览器
- path = 'chromedriver.exe'
- browser = webdriver.Chrome(path)
- cookie_url = 'https://www.bilibili.com/v/popular/all'
- browser.get(cookie_url)
- # 计数
- count=1
- # 中间写爬取内容
-
- print("爬取完毕")
- browser.close()
- f.close()
尝试发送请求:
- def get_content(url, pn, count):
- try:
- response = requests.get(url=url, headers=header, timeout=3)
- # print("状态码:",response.status_code)
- # print(response.text)
- json_list = json.loads(response.text)
- video_lists = json_list["data"]["list"]
- # print(response.text)
- # 先看一下第一个列表的内容
- print(video_lists[0])
-
- print("任务完成")
我们先看一下第一条数据列表里都有什么属性
根据返回的json数据列表提取出的各个属性,我们可以根据各个属性简单提取出我们需要的信息
- import datetime as dt
- # 时间戳转换
- def timestamp_to_timestr(timestamp):
- # 可以根据自己想要的格式进行设置
- # return dt.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S.%f")
- return dt.datetime.fromtimestamp(timestamp)
- def get_content(url, pn, count):
- try:
- response = requests.get(url=url, headers=header, timeout=3)
- # print("状态码:",response.status_code)
- # print(response.text)
- json_list = json.loads(response.text)
- video_lists = json_list["data"]["list"]
- # print(response.text)
- # 遍历列表
- print(video_lists[0])
- for item in video_lists:
- title = item['title'] # 标题
- pic = item['pic'] # 封面图片
- duration = item['duration'] # 时长
- owner = item['owner'] # up主信息
- owner_name = owner['name'] # up主名字
- owner_face = owner['face'] # up主头像图片链接
- video_link = item['short_link_v2'] # 视频链接
- des = item['item'] # 视频简介
- #去掉开头结尾以及中间的所以空格
- des = des.strip().replace(" ","")
- if 'pub_location' in item:
- location = item['pub_location'] # 发布ip
- else:
- location = '未知'
- view = item['stat']['view'] # 观看次数
- like = item['stat']['like'] # 点赞数量
- coin = item['stat']['coin'] # 投币数量
- share = item['stat']['share'] # 分享数量
- favorite = item['stat']['favorite'] # 收藏量
- reply = item['stat']['reply'] # 评论数量
- pubdate = item['pubdate'] # 发布日期 这里是时间戳类型 需要进行转化
- pubdate = timestamp_to_timestr(pubdate) # 时间转换
- rcmd_reason = item['rcmd_reason']['content'] # 推荐原因
- print(title, owner_name, view, video_link)
- # 写入文件
- f.write(str(count) + "." + title + '\n')
- f.write("发布日期:"+pubdate+"\n")
- f.write("视频简介:"+des+"\n")
- f.write("时长:" + str(duration) + '秒\n')
- f.write("up主昵称:" + owner_name + '\n')
- f.write("视频链接:" + video_link + '\n')
- f.write("观看次数:" + str(view) + '\n')
- f.write("点赞量:" + str(like) + '\n')
- f.write("发布ip:" + location + '\n')
- f.write("\n")
- count+=1
- print("第", pn, "页爬取完毕")
-
-
- except Exception as r:
- print(pn, "页爬取异常:", r)
- # f.close()
- print("任务完成")
我们简单获取了部分属性
当我们即将大功告成运行时,发现当我们连续请求时,第三页开始之后返回的json格式中,
"no_more":true
属性被置为true,返回的列表自然也是空的了。
因此我们借用selenium来模拟真实浏览器请求数据,每次请求完一页的20条数据,就执行滑到底部的操作,加载出新的数据后再进行数据请求,这样,每一页的数据都能完美请求得到了。
- if __name__ == '__main__':
- # 启动浏览器
- path = 'chromedriver.exe'
- browser = webdriver.Chrome(path)
- cookie_url = 'https://www.bilibili.com/v/popular/all'
- browser.get(cookie_url)
- count=1
-
- for pn in range(1,21):
- url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='+str(pn)
- get_content(url=url,pn=pn,count=count)
- browser.execute_script('window.scrollBy(0,500)')
- # 停留
- time.sleep(1)
- count+=20
- print("爬取完毕")
- browser.close()
- f.close()
写入的文件展示
如图,这里提取的信息并未全部写入,只是拿了部分信息写入。
我们成功地拿到了所有的热门视频的信息。由于这个榜单会不定时变动,可以利用定时器功能,每天定时提取。
- # 爬取哔哩哔哩热门视频数据
- import requests
- import json
- import time
- from fake_useragent import UserAgent
- from selenium import webdriver
- ua = UserAgent()
- import datetime as dt
- # 时间戳转换
- def timestamp_to_timestr(timestamp):
- # return dt.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S.%f")
- return dt.datetime.fromtimestamp(timestamp)
- # 页数不写死
- url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='
- header = {
- "User-Agent":ua.chrome,
- }
- # 打开准备写入文件 文件名自定义
- f = open("hot_bilibili4.txt",'w',encoding='utf-8')
-
-
- def get_content(url, pn, count):
- try:
- response = requests.get(url=url, headers=header, timeout=3)
- # print("状态码:",response.status_code)
- # print(response.text)
- json_list = json.loads(response.text)
- video_lists = json_list["data"]["list"]
- # print(response.text)
- # 遍历列表
- print(video_lists[0])
- for item in video_lists:
- title = item['title'] # 标题
- pic = item['pic'] # 封面图片
- duration = item['duration'] # 时长
- owner = item['owner'] # up主信息
- owner_name = owner['name'] # up主名字
- owner_face = owner['face'] # up主头像图片链接
- video_link = item['short_link_v2'] # 视频链接
- des = item['desc'] # 视频简介
- #去掉开头结尾以及中间的所以空格
- des = des.strip().replace(" ","")
- if 'pub_location' in item:
- location = item['pub_location'] # 发布ip
- else:
- location = '未知'
- view = item['stat']['view'] # 观看次数
- like = item['stat']['like'] # 点赞数量
- coin = item['stat']['coin'] # 投币数量
- share = item['stat']['share'] # 分享数量
- favorite = item['stat']['favorite'] # 收藏量
- reply = item['stat']['reply'] # 评论数量
- rcmd_reason = item['rcmd_reason']['content'] # 推荐原因
- pubdate = item['pubdate'] # 发布日期 这里是时间戳类型 需要进行转化
- pubdate = timestamp_to_timestr(pubdate) # 时间转换
- print(title, owner_name, view, video_link)
- # 写入文件
- f.write(str(count) + "." + title + '\n')
- f.write("发布日期:"+str(pubdate)+"\n")
- f.write("视频简介:"+des+"\n")
- f.write("时长:" + str(duration) + '秒\n')
- f.write("up主昵称:" + owner_name + '\n')
- f.write("视频链接:" + video_link + '\n')
- f.write("观看次数:" + str(view) + '\n')
- f.write("点赞量:" + str(like) + '\n')
- f.write("发布ip:" + location + '\n')
- f.write("\n")
- count+=1
- print("第", pn, "页爬取完毕")
-
-
- except Exception as r:
- print(pn, "页爬取异常:", r)
- # f.close()
- print("任务完成")
-
-
- if __name__ == '__main__':
- # 启动浏览器
- path = 'chromedriver.exe'
- browser = webdriver.Chrome(path)
- cookie_url = 'https://www.bilibili.com/v/popular/all'
- browser.get(cookie_url)
- cookies = browser.get_cookies()
- # 计数
- count=1
-
- for pn in range(1,21):
- url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='+str(pn)
- get_content(url=url,pn=pn,count=count)
- browser.execute_script('window.scrollBy(0,500)')
- # 停留
- time.sleep(1)
- count+=20
- print("爬取完毕")
- browser.close()
- f.close()
-
-
-
-
-
-
-
-
此外,获取到的视频信息可以用作词频分析,词云制作,构图等等,更多功能可以自行探索。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。