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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
Python入门篇之面向对象
Oct 20 Python
python从入门到精通(DAY 2)
Dec 20 Python
使用python生成目录树
Mar 29 Python
Python中的heapq模块源码详析
Jan 08 Python
详解从Django Rest Framework响应中删除空字段
Jan 11 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
哪些是python中web开发框架
Jun 17 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
PyQt5 显示超清高分辨率图片的方法
Apr 11 Python
python字典进行运算原理及实例分享
Aug 02 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
python处理PHP数组文本文件实例
2014/09/18 Python
python Tkinter的图片刷新实例
2019/06/14 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
Django静态文件加载失败解决方案
2020/08/26 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
房屋租赁合同协议书范本
2014/10/19 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python
基于redis+lua进行限流的方法
2022/07/23 Redis
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android