欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

梨视频爬取

程序员文章站 2022-04-11 17:13:18
...

网络爬虫在现在很常见,这一篇介绍一下怎么使用python爬虫来爬取梨视频中的短视频。话不多说,开始吧!

导入类库

import requests
#xpath库
import lxml.html
#selenium浏览器模拟库
from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FOptions
import time
#正则表达式库
import re
#随机数库
import random

这些是一会要用到的各种包,所以开始之前没有安装的朋友可以先安装下来,具体功能下面会有介绍。

分析

  1. 这里我们先决定我们要爬取网页的主url,暂定为"http://www.pearvideo.com/category_8",这是梨视频中科技类的url。
  2. 我们分析一下页面,会发现当我们将页面拉取到最下方时,会显示一个'加载更多'的按钮,只有点击了这个按钮下面的其他视频才会显示出来,所以我们需要在这里使用selenium模拟点击事件,来尽可能的让它显示更多的视频。
  3. 然后我们点击鼠标右键来检查页面,我们会发现每个视频的url都在a标签中,并且是这样的:'video_1430601'。很明显这不是一个完整的url,所以我们需要定义一个函数来进行url的拼接。
  4. 再接下来随便点击一个视频进入其中,接着检查页面和查看页面源代码,你会发现在检查页面中显示的视频的地址在页面源代码中并不存在!不要着急,仔细检查,你会发现在script标签中存在一个变量名'srcUrl',它的值就是这个视频的网址,所以我们就需要使用正则表达式来匹配到这个网址了。
  5. 找到网址后,下面就简单了,直接下载就可以了。分析完了,下面我们就开始操作吧!!

操作

创建一个类,并把需要的功能函数先定义出来。

class VideoSpider:
    def __init__(self):
        """
        初始化对象
        """
        pass

    def save_url_list(self):
        """
        保存首页的所有url到列表
        :return:
        """
        pass

    def save_video_url_list(self):
        """
        保存所有的视频url到列表
        :return:
        """
        pass

    def save_video(self,video_url):
        """
        保存视频
        :return:
        """
        pass

     def run(self):
        """
        主函数
        :return:
        """
        pass


if __name__ == '__main__':

    spider = VideoSpider()
    spider.run()

我们的框架已经搭建起来了,下面就开始一个一个的编写函数了。

__init__:

    def __init__(self):
        """
        初始化对象
        """
        self.url = "http://www.pearvideo.com/category_8"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
        }
        options = FOptions()
        #无头模式
        options.add_argument('-headless')
        self.browser = webdriver.Firefox(executable_path='E:\FireFox\geckodriver\geckodriver.exe',firefox_options=options)
        self.browser.get("http://www.pearvideo.com/category_8")

由于我们需要使用selenium浏览器模拟,所以我们可以在初始化时直接常见对象,并把主url给模拟器。这里我们使用火狐浏览器来进行模拟。使用selenium时需要下载适合你的火狐版本的geckodriver。executable_path就是你下载好后放置的位置。(记得要打开无头模式,要不然运行着你的火狐浏览器会自己弹出来)

save_url_list:

    def save_url_list(self):
        """
        保存首页的所有url到列表
        :return:
        """
        #使用selenium模拟下拉并点击'加载更多'按钮事件
        self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")

        #建议先注释掉for循环
        for i in range(1):
            time.sleep(2)
            self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
            button = self.browser.find_element_by_id("listLoadMore")
            button.click()

        #获取页面源码,并匹配到所有符合条件的链接
        text = self.browser.page_source
        html = lxml.html.fromstring(text)
        #获取url地址
        html_data = html.xpath('//a[@class="vervideo-lilink actplay"]/@href')
        #拼接url地址
        html_data = str_join("http://www.pearvideo.com/",html_data)
        return html_data

这里面for循环中range中的数就是你要点击几次'加载页面'按钮,这里我建议各位先不要使用for循环,因为如果使用之后就会产生更多的url,因为这里是爬取视频,本身就爬取的比较慢,使用更多的url会半天都爬取不下来。如果想要马上就看到成果,可以将'return'后的'html_data'替换成'["http://www.pearvideo.com/video_1449578",]',先爬取一个视频看一下成果。

save_video_url_list:

    def save_video_url_list(self):
        """
        保存所有的视频url到列表
        :return:
        """
        url_list = self.save_url_list()
        video_url_list = []
        for i in url_list:
            time.sleep(2)
            request = requests.get(i,headers=self.headers)
            #因为视频的url在script中,所以使用正则表达式匹配url
            area = re.compile(r'srcUrl="(.+?)",')
            video_url = area.search(request.text)
            if video_url:
                video_url_list.append(video_url.group(1))

        return video_url_list

这一个函数的作用就是将存在于script中的视频地址提取出来,然后放在一个列表中,返回。

save_video:

    def save_video(self,video_url):
        """
        保存视频
        :return:
        """
        request = requests.get(video_url,headers=self.headers)
        with open('./video/'+random_str()+'.mp4','wb') as f:
            f.write(request.content)

在这个.py文件同级目录下创建一个video文件夹来存放视频。

run:

    def run(self):
        """
        主函数
        :return:
        """
        for i in self.save_video_url_list():
            self.save_video(i)

主函数,负责所有函数的运行。

还没完!细心的朋友会发现网址拼接函数和随机字符串函数还没有,不要着急。注意:将下面两个函数放在类外面,不要放在类里面。

#拼接网址
def str_join(url,url_list):
    new_url_list = []
    for i in url_list:
        new_url_list.append(url+i)
    return new_url_list

#生成随机字符串函数
def random_str():
    str_str = "1234567890abcdefghijklmnopqrstuvwsyz"
    return ''.join(random.choice(str_str) for i in range(5))

我们的视频爬虫已经完成了,下面让我们运行起来它吧。

if __name__ == '__main__':

    spider = VideoSpider()
    spider.run()

咔咔咔,爬虫已经开始工作了,不过会比较慢,所以不忙的朋友可以喝杯茶慢慢的等等。如果有忙的朋友,可以看看我上面给出的建议,这样起码可以先看到自己的成果嘛!