一、前言
之前学了requests库,正跃跃欲试打算去随便爬一些东西时,发现梨视频网站的视频利用requests完全没办法爬取,使用开发者完全搜索不到视频的连接网站,虽然有一个阿贾克斯请求里面包含的字典中有一个MP4连接,但是对那个阿贾克斯请求的url发请求获取的字典里面关于超链接地址的全部找不到,且即使找到了那个MP4连接访问后也是404错误。以其中一个视频为例。
该MP4超链接返回的是404,且该阿贾克斯的url访问后也得不到这个MP4超链接。
二、selenium模拟浏览器获取页面信息
后来学了selenium后发现通过该库模拟浏览器爬取页面信息后可以获取MP4的超链接。
于是尝试的对梨视频的视频文件进行下载,代码如下:
import requests
from lxml import etree
from selenium import webdriver
if __name__ == '__main__':
#进行头部信息伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
url = 'https://www.pearvideo.com/category_8'
#获取科技页面中最新的视频所包含的网站的li列表
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="listvideoListUl"]/li')
#print(li_list)
#生成一个浏览器对象
option = webdriver.ChromeOptions()
option.binary_location = 'E:\\Google Chrome浏览器\\Google\\Chrome\\Application\\chrome.exe'
bro = webdriver.Chrome(executable_path=r'E:\chrome浏览器驱动程序\chromedriver_win32\chromedriver', options=option)
for li in li_list:
#对li列表循环获取每个最新视频的url
deta_url = 'https://www.pearvideo.com/' + li.xpath('./div/a/@href')[0]
name = li.xpath('./div/a/div[2]/text()')[0] + '.mp4'
#利用浏览器对象访问每个视频页面
bro.get(deta_url)
# page_source获取视频页面源码数据
page_text_mp4 = bro.page_source
#生成etree对象来进行xpath解析
tree = etree.HTML(page_text_mp4)
#提取页面数据中的MP4连接
mp4_url = tree.xpath('//*[@id="JprismPlayer"]/video/@src')[0]
#获取MP4的二进制数据并存储
mp4_rar = requests.get(url=mp4_url,headers=headers).content
with open(name,'wb') as fp:
fp.write(mp4_rar)
print(name,'爬取成功!!')
#关闭浏览器对象
bro.quit()
上面的代码只爬取了一个页面四个视频,如果要爬取更多则需要加一个循环即可。