爬虫入门实战第一站——梨视频视频爬取

爬虫入门实战第一站——梨视频视频爬取

简介

博主最近重新开始了解爬虫,想以文字方式记录自己学习和操作的过程。本篇文章主要是使用爬虫爬取梨视频网站中的视频并下载到本地,同时将视频简介和视频网站保存在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
# 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键进行抓包
在这里插入图片描述
然后点击这个请求,发现它有两个参数:

  • 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")
	# 获得视频的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)

猜你喜欢

转载自blog.csdn.net/qq_41234663/article/details/127794087