python爬虫线程池案例详解(梨视频短视频爬取)


Posted in Python onFebruary 20, 2021

python爬虫-梨视频短视频爬取(线程池)

示例代码

import requests
from lxml import etree
import random
from multiprocessing.dummy import Pool


# 多进程要传的方法,多进程pool.map()传的第二个参数是一个迭代器对象
# 而传的get_video方法也要有一个迭代器参数
def get_video(dic):
  headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
    }
  video_data = requests.get(url = dic['url'] , headers = headers).content
  print(dic['name']+'开始下载')
  
  # 有的文件名中包含空格,在并发执行时会报错,这里用随机数给文件起名了
  #path = dic['name']+'.mp4'会报错
  path = "./lishipin/"+str(int(random.random()*100)) + '.mp4'
  
  with open(path,'wb') as fp:
    fp.write(video_data)
  print(dic['name']+'下载成功')

def main():  
  # web_url:梨视频官网
  web_url = 'https://www.pearvideo.com/category_5'
  headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
    }
  
  # web_page_tex:官网页面
  web_page_text = requests.get(url = web_url,headers = headers).text
  
  tree = etree.HTML(web_page_text)
  
  # 解析梨视频官网“生活栏”中的所有li标签,遍历li标签,提取视频的url
  li_list = tree.xpath('//*[@id="listvideoListUl"]/li')
  rea_urls=[]
  for li in li_list:
     # video_name获取视频的名称
    video_name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4'
    
    # 加上'https://www.pearvideo.com/'得到完整的video_url
    video_url = 'https://www.pearvideo.com/'+li.xpath("./div/a/@href")[0]
    
    # 通过官网界面提取的url,并不是真正的url,
    # 因为MP4的视频是动态加载出来的,所以通过ajax请求获取视频的真实网址
    # 但是通过分析发现,ajax请求获取的网址是一个伪网址,和真实网址有区别(cont...)
      ##真地址:https://video.pearvideo.com/mp4/third/20210208/cont-1719874-15690592-205957-ld.mp4
      ##                          1719874
      ##伪地址:https://video.pearvideo.com/mp4/third/20210208/1612867876612-15690592-205957-ld.mp4


    # 通过得到的video_url可以分析到 真假网址 不同的细节之处--countId
    # 通过ajax请求向video_url发起get请求,需要加countId和mrd参数
    # 分析video_url得到countId,mrd是一个随机小树
    countId = video_url.split("/")[-1].split("_")[1]
    mrd = random.random()
    
    # 加'Referer'参数,否则会显示该视频已下架了
    headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56',
      'Referer': 'https://www.pearvideo.com/video_' + countId
      }
    ajax_url = 'https://www.pearvideo.com/videoStatus.jsp'
    
    # 利用ajax请求获取伪地址
    # https://www.pearvideo.com/videoStatus.jsp?contId=1719874&mrd=0.7759942025851074
    params = {
        'contId': str(countId),
        'mrd': str(mrd)
      }
    
    # 通过ajax请求,发起get请求得到一个json串
    ajax_json = requests.get(url = ajax_url,headers = headers,params = params).json()
    
    # 得到的是 假地址
    fake_url = ajax_json['videoInfo']['videos']['srcUrl']
    
    # 对假地址进行处理,并把刚才的countId组合起来
    fake_url_list = fake_url.split('/')
    end = fake_url_list.pop()  #删除不必要的字符串
    end_list = end.split("-")
    end_url = ""  #end_url是一个结尾字符串
    for i in range(len(end_list)-1):
      end_url = end_url + "-"+ end_list[i+1]
    
    # 真实的地址,先用假地址,然后组合countId
    rea_url=""
    for element in fake_url_list:
      rea_url=rea_url+element+"/"
    rea_url=rea_url+"cont-"+str(countId) + end_url
    
    # print(rea_url)
    
    
    dic = {
        'url':rea_url,
        'name':video_name
      }
    rea_urls.append(dic)
    
  #print(rea_urls)
  pool = Pool(4)
  pool.map(get_video,rea_urls)
  pool.close()
  pool.join()
  
if __name__ == '__main__':
  main()

知识点扩展:

Python爬虫下载视频(梨视频)

梨视频示例:Ctrl+Alt+L格式化代码

import re
import requests
import hashlib
import time
# print(respose.status_code)# 响应的状态码
# print(respose.content) #返回字节信息
# print(respose.text) #返回文本内容
 
mainurl = "https://www.pearvideo.com/"
videourl = "http://www.pearvideo.com/video_1499584"
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'Accept-Encoding':'gzip, deflate, sdch',
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language':'zh-CN,zh;q=0.8',
  }
# 获取视频链接列表
def geturls(url):
  res=requests.get(url)
  urls=re.findall('class="vervideo-tbd".*?href="(.*?)" rel="external nofollow" ',res.text,re.S)
  urllist=[]
  for i in urls:
    prefix='https://www.pearvideo.com/'
    urllist.append(prefix+i)
  return urllist
# 获取视频链接并下载(写入到硬盘)
def getvideo(url):
  res=requests.get(url,headers)
  mp4url=re.findall('srcUrl="(.*?\.mp4)"',res.text,re.S)[0]
  video=requests.get(mp4url)
  m = hashlib.md5()
  m.update(url.encode('utf-8'))
  m.update(str(time.time()).encode('utf-8'))
  filename = r'%s.mp4' % m.hexdigest()
  print(filename)
  with open("/home/tony/文档/爬虫视频/%s.mp4"%filename,'wb') as f:
    f.write(video.content)
def main():
  video_urllist=geturls(mainurl)
  for i in video_urllist:
    getvideo(i)
if __name__=='__main__':
  main()

到此这篇关于python爬虫线程池案例详解(梨视频短视频爬取)的文章就介绍到这了,更多相关python爬虫梨视频短视频爬取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 实现文件的递归拷贝实现代码
Aug 02 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
Feb 14 Python
python 垃圾收集机制的实例详解
Aug 20 Python
python 生成器协程运算实例
Sep 04 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
Django上线部署之IIS的配置方法
Aug 22 Python
python 实现矩阵填充0的例子
Nov 29 Python
解决python 读取 log日志的编码问题
Dec 24 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 #Python
Keras保存模型并载入模型继续训练的实现
Feb 20 #Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 #Python
tensorflow2.0教程之Keras快速入门
Feb 20 #Python
在Pycharm中安装Pandas库方法(简单易懂)
Feb 20 #Python
Python3爬虫RedisDump的安装步骤
Feb 20 #Python
python爬取2021猫眼票房字体加密实例
Feb 19 #Python
You might like
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
浅谈js中的bind
2019/03/18 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
Python学习笔记之函数的定义和作用域实例详解
2019/08/13 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python中adb有什么功能
2020/06/07 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
八年级生物教学反思
2014/01/22 职场文书
2014年元旦感言
2014/03/06 职场文书
企业委托书范本
2014/09/13 职场文书
安全员岗位职责
2015/02/10 职场文书
职工食堂管理制度
2015/08/06 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang