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

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

简介

博主最近重新开始了解爬虫,想以文字方式记录自己学习和操作的过程。本篇文章主要是使用爬虫爬取梨视频网站中的视频并下载到本地,同时将视频简介和视频网站保存在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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球