博主最近重新开始了解爬虫,想以文字方式记录自己学习和操作的过程。本篇文章主要是使用爬虫爬取梨视频网站中的视频并下载到本地,同时将视频简介和视频网站保存在excel表里面,进行持久化存储。
使用的python包:
使用浏览器:
(1)进入梨视频网站,然后选择人物(也可以自己根据情况选择,但是可能代码不一定适用)
(2)按下F12键打开开发者模式,点击如下图标进行元素定位:
(3)第(2)步后会出现下面的界面:
我们想要得到的是视频的地址,要想获得视频地址我们还需要进入视频播放界面,通过观察,我们可以从上图得到这个视频的视频播放地址,就是https://www.pearvideo.com/video_1556159
则我们应该获取的是li标签下的第一个a标签,a标签的class属性值为vervideo-lilink
注意这里使用class属性值来获取,不使用标签来获取,因为li标签下面还有一个a标签。
该li标签下还有视频的简介:
通过观察,我们通过class属性值来获取就可以了,即:class属性值为vervideo-title的。
前面几步的代码如下:
url = "https://www.pearvideo.com/category_1"
base_url = "https://www.pearvideo.com/"
# 请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
# 创建一个会话,在会话里面进行操作
session = requests.Session()
# 获得页面内容
person_page = session.get(url=url,headers=headers).text
# print(person_page)
# 使用BeautifulSoup解析这一页
bs = BeautifulSoup(person_page, 'html.parser')
# 使用选择器进行定位
## 找到所有带有视频地址的a标签
person_a = bs.select(".vervideo-bd .vervideo-lilink")
## 找到a标签下视频的简介
person_content = bs.select(".vervideo-bd .vervideo-lilink .vervideo-title")
(4)然后我们进入其中一个视频播放界面,按下F5键进行抓包
然后点击这个请求,发现它有两个参数:
然后看下它的响应,发现有我们需要的地址,但是注意:这个地址我们复制之后是访问不了的,这其实是一个虚假的地址,不是真正的地址,那真正的地址是什么呢?
真正的地址我们我们可以在现在这个界面找到,如下图所示:
通过上面的分析,
真地址为:https://video.pearvideo.com/mp4/adshort/20190519/cont-1556159-13923459_adpkg-ad_hd.mp4
假地址为:https://video.pearvideo.com/mp4/adshort/20190519/1668240894839-13923459_adpkg-ad_hd.mp4
通过比较,我们发现主要是1668240894839将cont-1556159替换掉了,而cont-1556159其实就是cont-video的id,那我们将1668240894839替换掉就好了,videoId我们之前都获得了的。
由此我们的思路就出来了:
但我们需要注意这里有一个坑,当我们向https://www.pearvideo.com/videoStatus.jsp发起请求时,请求头里面需要加一个Referer,表示你是从哪个界面过来的,比如这里,我们就是
'Referer':'https://www.pearvideo.com/video_1556159'
这部分的代码如下:
links = []
conent = []
a_size = len(person_a)
real_videos = []
real_urls = []
for i in range(a_size):
links.append(base_url + person_a[i]['href'])
conent.append(person_content[i].string + ".mp4")
# 获得视频的id,之后有用
contId = person_a[i]['href'].split("_")[1]
mrd = random.random()
# 这个我们进入到视频界面后进行抓包可以发现需要这两个参数
# 抓包发现的网址为:https://www.pearvideo.com/videoStatus.jsp
# 向它发起请求会得到视频的假地址
params = {
"contId":contId,
"mrd":mrd
}
video_url = "https://www.pearvideo.com/videoStatus.jsp"
# 如果使用该语句会发现"视频已下线"
# video_response = session.get(url=video_url,headers=headers,data=data).json()
# 解决办法:往header里面加一个Referer就好
headers["Referer"] = links[i]
video_response = session.get(url=video_url, headers=headers, params = params).json()
# 这是一个假的视频地址
# 真地址其实可以在前面一个网页中找到,为:https://video.pearvideo.com/mp4/adshort/20190324/cont-1534025-13728370_adpkg-ad_hd.mp4
# 而假地址为:https://video.pearvideo.com/mp4/adshort/20190324/1668071072522-13728370_adpkg-ad_hd.mp4
# 通过观察可以发现后面的cont-1534025替换为了1668071072522,cont-1534025其实就是cont-videoId,则我们将假地址错误的部分替换即可
fake_video_url = video_response['videoInfo']['videos']['srcUrl']
ss = fake_video_url.split("/")
end_string = ss[-1].split("-")
end_fix = ""
for s in range(1,len(end_string)):
end_fix = end_fix + "-" + end_string[s]
start_fix = ""
for s in range(len(ss)-1):
start_fix = start_fix + ss[s] + "/"
real_video_url = start_fix + "cont-" + str(contId) + end_fix
dic = {
"url":real_video_url,
"name":conent[i]
}
real_videos.append(dic)
real_urls.append(real_video_url)
(5)最后使用多进程进行下载和将信息写入excel表里面。
import requests
from bs4 import BeautifulSoup
import random
import pandas as pd
from multiprocessing.dummy import Pool
def get_video(dic):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
video_data = requests.get(url=dic['url'], headers=headers).content
print(dic['name'] + '开始下载')
path = "./" + dic['name']
with open(path, 'wb') as fp:
fp.write(video_data)
print(dic['name'] + '下载成功')
if __name__ == '__main__':
url = "https://www.pearvideo.com/category_1"
base_url = "https://www.pearvideo.com/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
session = requests.Session()
person_page = session.get(url=url,headers=headers).text
# print(person_page)
# 使用BeautifulSoup解析这一页
bs = BeautifulSoup(person_page, 'html.parser')
# 使用选择器进行定位
## 找到a标签
person_a = bs.select(".vervideo-bd .vervideo-lilink")
## 找到a标签下视频的简介
person_content = bs.select(".vervideo-bd .vervideo-lilink .vervideo-title")
# 保存到一个列表当中
links = []
conent = []
a_size = len(person_a)
real_videos = []
real_urls = []
for i in range(a_size):
links.append(base_url + person_a[i]['href'])
conent.append(person_content[i].string + ".mp4")
# 获得视频的id,之后有用
contId = person_a[i]['href'].split("_")[1]
mrd = random.random()
# 这个我们进入到视频界面后进行抓包可以发现需要这两个参数
# 抓包发现的网址为:https://www.pearvideo.com/videoStatus.jsp
# 向它发起请求会得到视频的假地址
params = {
"contId":contId,
"mrd":mrd
}
video_url = "https://www.pearvideo.com/videoStatus.jsp"
# 如果使用该语句会发现"视频已下线"
# video_response = session.get(url=video_url,headers=headers,data=data).json()
# 解决办法:往header里面加一个Referer就好
headers["Referer"] = links[i]
video_response = session.get(url=video_url, headers=headers, params = params).json()
# 这是一个假的视频地址
# 真地址其实可以在前面一个网页中找到,为:https://video.pearvideo.com/mp4/adshort/20190324/cont-1534025-13728370_adpkg-ad_hd.mp4
# 而假地址为:https://video.pearvideo.com/mp4/adshort/20190324/1668071072522-13728370_adpkg-ad_hd.mp4
# 通过观察可以发现后面的cont-1534025替换为了1668071072522,cont-1534025其实就是cont-videoId,则我们将假地址错误的部分替换即可
fake_video_url = video_response['videoInfo']['videos']['srcUrl']
ss = fake_video_url.split("/")
end_string = ss[-1].split("-")
end_fix = ""
for s in range(1,len(end_string)):
end_fix = end_fix + "-" + end_string[s]
start_fix = ""
for s in range(len(ss)-1):
start_fix = start_fix + ss[s] + "/"
real_video_url = start_fix + "cont-" + str(contId) + end_fix
dic = {
"url":real_video_url,
"name":conent[i]
}
real_videos.append(dic)
real_urls.append(real_video_url)
# 下载视频
# pool = Pool(4)
# pool.map(get_video,real_videos)
# pool.close()
# pool.join()
# 存在excel表里面
data = pd.DataFrame({"视频简介":conent,"视频地址":real_urls})
data.to_excel("视频信息.xlsx", sheet_name='Sheet1', index=False)