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 运算符 供重载参考
Jun 11 Python
python让图片按照exif信息里的创建时间进行排序的方法
Mar 16 Python
python实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
Python多进程并发与多线程并发编程实例总结
Feb 08 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
python中的colorlog库使用详解
Jul 05 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
python manage.py runserver流程解析
Nov 08 Python
python打包多类型文件的操作方法
Sep 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
非常好的php目录导航文件代码
2006/10/09 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
详解redis在nodejs中的应用
2018/05/02 NodeJs
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
python命令行参数sys.argv使用示例
2014/01/28 Python
Python set集合类型操作总结
2014/11/07 Python
python计算圆周率pi的方法
2015/07/11 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
关于django python manage.py startapp 应用名出错异常原因解析
2020/12/15 Python
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
法律进企业活动方案
2014/03/04 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
求职信标题怎么写
2014/05/26 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
python实现简单的名片管理系统
2021/04/26 Python