网络爬虫在现在很常见,这一篇介绍一下怎么使用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()

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

 

 

 

 

 

 

 

 

 

 

 

 

10-07 17:41