爬虫入门实战第一站——梨视频视频爬取
简介
博主最近重新开始了解爬虫,想以文字方式记录自己学习和操作的过程。本篇文章主要是使用爬虫爬取梨视频网站中的视频并下载到本地,同时将视频简介和视频网站保存在excel表里面,进行持久化存储。
使用的python包:
- pandas(数据存储)
- requests(发起请求)
- bs4(进行解析网页)
- multiprocessing(多进程操作)
使用浏览器:
- Edge浏览器
步骤
(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
bs = BeautifulSoup(person_page, 'html.parser')
person_a = bs.select(".vervideo-bd .vervideo-lilink")
person_content = bs.select(".vervideo-bd .vervideo-lilink .vervideo-title")
(4)然后我们进入其中一个视频播放界面,按下F5键进行抓包
然后点击这个请求,发现它有两个参数:
- contId其实就是video的ID,我们可以将它和之前a标签里面的地址进行比较,它就是video_后面的数字
- mrd就是一个0-1的随机数
然后看下它的响应,发现有我们需要的地址,但是注意:这个地址我们复制之后是访问不了的,这其实是一个虚假的地址,不是真正的地址,那真正的地址是什么呢?
真正的地址我们我们可以在现在这个界面找到,如下图所示:
通过上面的分析,
真地址为: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发起请求
- 从上面的返回值中获取虚假的地址
- 将虚假的地址变为真实的地址
但我们需要注意这里有一个坑,当我们向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")
contId = person_a[i]['href'].split("_")[1]
mrd = random.random()
params = {
"contId":contId,
"mrd":mrd
}
video_url = "https://www.pearvideo.com/videoStatus.jsp"
headers["Referer"] = links[i]
video_response = session.get(url=video_url, headers=headers, params = params).json()
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
bs = BeautifulSoup(person_page, 'html.parser')
person_a = bs.select(".vervideo-bd .vervideo-lilink")
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")
contId = person_a[i]['href'].split("_")[1]
mrd = random.random()
params = {
"contId":contId,
"mrd":mrd
}
video_url = "https://www.pearvideo.com/videoStatus.jsp"
headers["Referer"] = links[i]
video_response = session.get(url=video_url, headers=headers, params = params).json()
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)
data = pd.DataFrame({"视频简介":conent,"视频地址":real_urls})
data.to_excel("视频信息.xlsx", sheet_name='Sheet1', index=False)
Original: https://blog.csdn.net/qq_41234663/article/details/127794087
Author: lzl2040
Title: 爬虫入门实战第一站——梨视频视频爬取
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/659201/
转载文章受原作者版权保护。转载请注明原作者出处!