• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
Guogangts 显示全部楼层 发表于 2021-10-25 19:53:25 |阅读模式 打印 上一主题 下一主题
python爬虫-梨视频短视频爬取(线程池)
示例代码
  1. import requests
  2. from lxml import etree
  3. import random
  4. from multiprocessing.dummy import Pool
  5. # 多进程要传的方法,多进程pool.map()传的第二个参数是一个迭代器对象
  6. # 而传的get_video方法也要有一个迭代器参数
  7. def get_video(dic):
  8.   headers = {
  9.     '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'
  10.     }
  11.   video_data = requests.get(url = dic['url'] , headers = headers).content
  12.   print(dic['name']+'开始下载')
  13.   
  14.   # 有的文件名中包含空格,在并发执行时会报错,这里用随机数给文件起名了
  15.   #path = dic['name']+'.mp4'会报错
  16.   path = "./lishipin/"+str(int(random.random()*100)) + '.mp4'
  17.   
  18.   with open(path,'wb') as fp:
  19.     fp.write(video_data)
  20.   print(dic['name']+'下载成功')
  21. def main():  
  22.   # web_url:梨视频官网
  23.   web_url = 'https://www.pearvideo.com/category_5'
  24.   headers = {
  25.     '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'
  26.     }
  27.   
  28.   # web_page_tex:官网页面
  29.   web_page_text = requests.get(url = web_url,headers = headers).text
  30.   
  31.   tree = etree.HTML(web_page_text)
  32.   
  33.   # 解析梨视频官网“生活栏”中的所有li标签,遍历li标签,提取视频的url
  34.   li_list = tree.xpath('//*[@id="listvideoListUl"]/li')
  35.   rea_urls=[]
  36.   for li in li_list:
  37.      # video_name获取视频的名称
  38.     video_name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4'
  39.    
  40.     # 加上'https://www.pearvideo.com/'得到完整的video_url
  41.     video_url = 'https://www.pearvideo.com/'+li.xpath("./div/a/@href")[0]
  42.    
  43.     # 通过官网界面提取的url,并不是真正的url,
  44.     # 因为MP4的视频是动态加载出来的,所以通过ajax请求获取视频的真实网址
  45.     # 但是通过分析发现,ajax请求获取的网址是一个伪网址,和真实网址有区别(cont...)
  46.       ##真地址:https://video.pearvideo.com/mp4/third/20210208/cont-1719874-15690592-205957-ld.mp4
  47.       ##                          1719874
  48.       ##伪地址:https://video.pearvideo.com/mp4/third/20210208/1612867876612-15690592-205957-ld.mp4
  49.     # 通过得到的video_url可以分析到 真假网址 不同的细节之处--countId
  50.     # 通过ajax请求向video_url发起get请求,需要加countId和mrd参数
  51.     # 分析video_url得到countId,mrd是一个随机小树
  52.     countId = video_url.split("/")[-1].split("_")[1]
  53.     mrd = random.random()
  54.    
  55.     # 加'Referer'参数,否则会显示该视频已下架了
  56.     headers = {
  57.       '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',
  58.       'Referer': 'https://www.pearvideo.com/video_' + countId
  59.       }
  60.     ajax_url = 'https://www.pearvideo.com/videoStatus.jsp'
  61.    
  62.     # 利用ajax请求获取伪地址
  63.     # https://www.pearvideo.com/videoStatus.jsp?contId=1719874&mrd=0.7759942025851074
  64.     params = {
  65.         'contId': str(countId),
  66.         'mrd': str(mrd)
  67.       }
  68.    
  69.     # 通过ajax请求,发起get请求得到一个json串
  70.     ajax_json = requests.get(url = ajax_url,headers = headers,params = params).json()
  71.    
  72.     # 得到的是 假地址
  73.     fake_url = ajax_json['videoInfo']['videos']['srcUrl']
  74.    
  75.     # 对假地址进行处理,并把刚才的countId组合起来
  76.     fake_url_list = fake_url.split('/')
  77.     end = fake_url_list.pop()  #删除不必要的字符串
  78.     end_list = end.split("-")
  79.     end_url = ""  #end_url是一个结尾字符串
  80.     for i in range(len(end_list)-1):
  81.       end_url = end_url + "-"+ end_list[i+1]
  82.    
  83.     # 真实的地址,先用假地址,然后组合countId
  84.     rea_url=""
  85.     for element in fake_url_list:
  86.       rea_url=rea_url+element+"/"
  87.     rea_url=rea_url+"cont-"+str(countId) + end_url
  88.    
  89.     # print(rea_url)
  90.    
  91.    
  92.     dic = {
  93.         'url':rea_url,
  94.         'name':video_name
  95.       }
  96.     rea_urls.append(dic)
  97.    
  98.   #print(rea_urls)
  99.   pool = Pool(4)
  100.   pool.map(get_video,rea_urls)
  101.   pool.close()
  102.   pool.join()
  103.   
  104. if __name__ == '__main__':
  105.   main()
复制代码
知识点扩展:
Python爬虫下载视频(梨视频)
梨视频示例:Ctrl+Alt+L格式化代码
  1. import re
  2. import requests
  3. import hashlib
  4. import time
  5. # print(respose.status_code)# 响应的状态码
  6. # print(respose.content) #返回字节信息
  7. # print(respose.text) #返回文本内容
  8. mainurl = "https://www.pearvideo.com/"
  9. videourl = "http://www.pearvideo.com/video_1499584"
  10. headers={
  11.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
  12.     'Accept-Encoding':'gzip, deflate, sdch',
  13.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
  14.     'Accept-Language':'zh-CN,zh;q=0.8',
  15.   }
  16. # 获取视频链接列表
  17. def geturls(url):
  18.   res=requests.get(url)
  19.   urls=re.findall('class="vervideo-tbd".*?href="(.*?)" rel="external nofollow" ',res.text,re.S)
  20.   urllist=[]
  21.   for i in urls:
  22.     prefix='https://www.pearvideo.com/'
  23.     urllist.append(prefix+i)
  24.   return urllist
  25. # 获取视频链接并下载(写入到硬盘)
  26. def getvideo(url):
  27.   res=requests.get(url,headers)
  28.   mp4url=re.findall('srcUrl="(.*?\.mp4)"',res.text,re.S)[0]
  29.   video=requests.get(mp4url)
  30.   m = hashlib.md5()
  31.   m.update(url.encode('utf-8'))
  32.   m.update(str(time.time()).encode('utf-8'))
  33.   filename = r'%s.mp4' % m.hexdigest()
  34.   print(filename)
  35.   with open("/home/tony/文档/爬虫视频/%s.mp4"%filename,'wb') as f:
  36.     f.write(video.content)
  37. def main():
  38.   video_urllist=geturls(mainurl)
  39.   for i in video_urllist:
  40.     getvideo(i)
  41. if __name__=='__main__':
  42.   main()
复制代码
到此这篇关于python爬虫线程池案例详解(梨视频短视频爬取)的文章就先容到这了,更多相干python爬虫梨视频短视频爬取内容请搜索脚本之家以前的文章或继承浏览下面的相干文章希望大家以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作