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利用hook技术破解https的实例代码
Mar 25 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
python实现点对点聊天程序
Jul 28 Python
Python  unittest单元测试框架的使用
Sep 08 Python
python中的数据结构比较
May 13 Python
对python 调用类属性的方法详解
Jul 02 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 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
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php 可变函数使用小结
2018/06/12 PHP
phpStorm2020 注册码
2020/09/17 PHP
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
js读取本地文件的实例
2017/12/22 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
python shell根据ip获取主机名代码示例
2017/11/25 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
CSS3教程(9):设置RGB颜色
2009/04/02 HTML / CSS
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
大学生实习期自我评价范文
2013/10/03 职场文书
教学实验楼管理制度
2014/02/01 职场文书
学前教育见习总结
2015/06/23 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
mysql 获取相邻数据项
2022/05/11 MySQL