本次目标地址为梨视频:https://www.pearvideo.com/category_59
在实现数据抓取的时候需要注意以下几点:
视频资源数据大多数网站都是加密或者隐藏在js文件或者某个文件下面的,很少有在页面能够直接解析到源地址的。
在已知视频路径的情况下,避免使用有界面浏览器或者无界面浏览器,非常浪费资源,可以直接用requests发送请求
在使用多进程:multiprocessing要注意,必须在还有main脚本的文件去调用,否则直接报错。
本次小案例的主要实现代码:
from lxml import etree
import requests,re
from multiprocessing.pool import Pool #进程池
from tool import getVideo,saveVideo
def star():
pool = Pool(5) # 实例化若干个线程池对象
url=‘https://www.pearvideo.com/category_59‘
user_agent={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"}
mov_html=requests.get(url,headers=user_agent).text
tree=etree.HTML(mov_html)
mov_url_list=tree.xpath(‘//ul[@id="listvideoListUl"]/li/div/a/@href‘)
video_list=[]
for mov_url in mov_url_list:
movie_url=‘https://www.pearvideo.com/‘+mov_url #拼接的视频缩略图地址
detail_page=requests.get(url=movie_url,headers=user_agent).text #视频详情页面
#视频原始路径被隐藏至js代码块中 只能通过正则re去匹配结果
video_url=re.findall(‘srcUrl="(.*?)",vdoUrl‘,detail_page,re.S)[0] #原始视频地址
video_list.append(video_url) #原始视频地址追加至列表
#print(video_list)
movie_all = pool.map(getVideo, video_list)
pool.map(saveVideo, movie_all)
if __name__ == ‘__main__‘:
star()
多进程处理数据的代码:
import requests,uuid
user_agent={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"}
def getVideo(url): #下载视频流数据
return requests.get(url=url,headers=user_agent).content
def saveVideo(data): #保存视频数据
filename=str(uuid.uuid4())+".mp4"
with open(‘./movies/‘+filename,‘wb‘)as f:
f.write(data)
原文:https://www.cnblogs.com/wen-kang/p/10958071.html