梨视频爬取
程序员文章站
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
这些是一会要用到的各种包,所以开始之前没有安装的朋友可以先安装下来,具体功能下面会有介绍。
分析
- 这里我们先决定我们要爬取网页的主url,暂定为"http://www.pearvideo.com/category_8",这是梨视频中科技类的url。
- 我们分析一下页面,会发现当我们将页面拉取到最下方时,会显示一个'加载更多'的按钮,只有点击了这个按钮下面的其他视频才会显示出来,所以我们需要在这里使用selenium模拟点击事件,来尽可能的让它显示更多的视频。
- 然后我们点击鼠标右键来检查页面,我们会发现每个视频的url都在a标签中,并且是这样的:'video_1430601'。很明显这不是一个完整的url,所以我们需要定义一个函数来进行url的拼接。
- 再接下来随便点击一个视频进入其中,接着检查页面和查看页面源代码,你会发现在检查页面中显示的视频的地址在页面源代码中并不存在!不要着急,仔细检查,你会发现在script标签中存在一个变量名'srcUrl',它的值就是这个视频的网址,所以我们就需要使用正则表达式来匹配到这个网址了。
- 找到网址后,下面就简单了,直接下载就可以了。分析完了,下面我们就开始操作吧!!
操作
创建一个类,并把需要的功能函数先定义出来。
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()
咔咔咔,爬虫已经开始工作了,不过会比较慢,所以不忙的朋友可以喝杯茶慢慢的等等。如果有忙的朋友,可以看看我上面给出的建议,这样起码可以先看到自己的成果嘛!
上一篇: Python快速排序(采用递归的方法)
下一篇: 爬取梨视频