首页 文章详情

Python爬虫进阶之爬取某视频并下载的实现

python教程 | 350 2020-12-14 07:51 0 0 0
UniSMS (合一短信)

推荐阅读  点击标题可跳转

零基础将Python分成7个阶段学习,你会发现学习Python真的很简单

意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法。

下面说说流程:

一、网站分析

首先进入网站,F12检查,本来以为这种低端网站很好爬取,是我太低估了web主。可以看到我刷新网页之后,出现了很多js文件,并且响应获取的代码与源代码不一样,这就不难猜到这个网站是动态加载页面。

目前我知道的动态网页爬取的方法只有这两种:

1、从网页响应中找到JS脚本返回的JSON数据;

2、使用Selenium对网页进行模拟访问。

二、写代码

导入相关模块

  1. import requests

  2. from datetime import datetime

  3. import re

  4. #import json

  5. import time

  6. import os

  7.  

  8. #视频分类和视频列表URL的前一段

  9. url = "http://xxxxxxx/api/?d=pc&c=video&"

  10. #m3u8文件和ts文件的URL前一段

  11. m3u8_url ='https://xxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/'

  12. #构造请求头信息

  13. header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"}

  14. #创建空列表存放视频信息

  15. vediomassag=''

  16. #返回当前时间戳

  17. TimeStamp = int(datetime.timestamp(datetime.now()))

2.定义函数,获取网站首页分类列表信息

  1. #自定义函数获取分类

  2. def get_vediocategory(url, TimeStamp):

  3. cgURL = url + "m=categories×tamp=" + str(TimeStamp) + '&'

  4. response = requests.get(cgURL, headers=header)

  5. category = response.text

  6. # strrr='"%s"'%category

  7. # return strrr

  8. return category

3.定义函数,通过上一个函数返回的分类信息,根据分类对应的id,输入id并传输到当前URL中以便获取分类下的视频列表信息

  1. #获取分类后的视频列表

  2. def get_vedioList(url, TimeStamp, tagID):

  3. listURL = url + "m=lists×tamp=" + str(TimeStamp) + '&' + "page=1&tag_id=" + str(tagID) + "&sort_type=&is_vip=0"

  4. response = requests.get(listURL, headers=header)

  5. vedioLists = response.text

  6. return vedioLists

4.在视频列表信息中获取视频对应的id,获取单个视频详细信息的URL

  1. #获取单个视频的详细信息

  2. def get_vediomassages(url, TimeStamp, vedioID):

  3. videoURL = url + "m=detail×tamp=" + str(TimeStamp) + '&' + "&id=" + str(vedioID)

  4. response = requests.get(videoURL, headers=header)

  5. vediomassag = response.text

  6. return vediomassag

5.在视频详细信息中找到m3u8文件的下载地址,并将文件保存到创建的文件中

  1. #将下载的m3u8文件放进创建的ts列表文件中

  2. def get_m3u8List(m3u8_url,vediomassag):

  3. lasturl = r'"m3u8_720_url":"(.*?)","download_url'

  4. last_url =re.findall(lasturl,vediomassag)

  5. lastURL=m3u8_url+str(last_url)

  6. response = requests.get(lastURL, headers=header)

  7. tsList = response.text

  8. cur_path='E:\\files' #在指定路径建立文件夹

  9. try:

  10. if not os.path.isdir(cur_path): #确认文件夹是否存在

  11. os.makedirs(cur_path) #不存在则新建

  12. except:

  13. print("文件夹存在")

  14. filename=cur_path+'\\t2.txt' #在文件夹中存放txt文件

  15. = open(filename,'a', encoding="utf-8")

  16. f.write(tsList)

  17. f.close

  18. print('创建%s文件成功'%(filename))

  19. return filename

6.将m3u8文件中的ts单个提取出来放进列表中。

  1. # 提取ts列表文件的内容,逐个拼接ts的url,形成list

  2. def get_tsList(filename):

  3. ls = []

  4. with open(filename, "r") as file:

  5. line = f.readlines()

  6. for line in lines:

  7. if line.endswith(".ts\n"):

  8. ls.append(line[:-1])

  9. return ls

7.遍历列表获取单个ts地址,请求下载ts文件放进创建的文件夹中

  1. # 批量下载ts文件

  2. def DownloadTs(ls):

  3. length = len(ls)

  4. root='E:\\mp4'

  5. try:

  6. if not os.path.exists(root):

  7. os.mkdir(root)

  8. except:

  9. print("文件夹创建失败")

  10. try:

  11. for i in range(length):

  12. tsname = ls[i][:-3]

  13. ts_URL=url+ls[i]

  14. print(ts_URL)

  15. = requests.get(ts_URL)

  16. with open(root, 'a') as f:

  17. f.write(r.content)

  18. f.close()

  19. print('\r' + tsname + " -->OK ({}/{}){:.2f}%".format(i, length, i * 100 / length), end='')

  20. print("下载完毕")

  21. except:

  22. print("下载失败")

代码整合

  1. import requests

  2. from datetime import datetime

  3. import re

  4. #import json

  5. import time

  6. import os

  7.  

  8.  

  9. url = "http://xxxxxxxx/api/?d=pc&c=video&"

  10. m3u8_url ='https://xxxxxxxxxxxxxxx/videos/cherry-prod/2020/03/01/2dda82de-5b31-11ea-b5ae-1c1b0da2bc3f/hls/480/'

  11. header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2"}

  12. vediomassag=''

  13. TimeStamp = int(datetime.timestamp(datetime.now()))

  14.  

  15.  

  16.  

  17. #自定义函数获取分类

  18. def get_vediocategory(url, TimeStamp):

  19. cgURL = url + "m=categories×tamp=" + str(TimeStamp) + '&'

  20. response = requests.get(cgURL, headers=header)

  21. category = response.text

  22. # strrr='"%s"'%category

  23. # return strrr

  24. return category

  25.  

  26. #获取分类后的视频列表

  27. def get_vedioList(url, TimeStamp, tagID):

  28. listURL = url + "m=lists×tamp=" + str(TimeStamp) + '&' + "page=1&tag_id=" + str(tagID) + "&sort_type=&is_vip=0"

  29. response = requests.get(listURL, headers=header)

  30. vedioLists = response.text

  31. return vedioLists

  32.  

  33. #获取单个视频的详细信息

  34. def get_vediomassages(url, TimeStamp, vedioID):

  35. videoURL = url + "m=detail×tamp=" + str(TimeStamp) + '&' + "&id=" + str(vedioID)

  36. response = requests.get(videoURL, headers=header)

  37. vediomassag = response.text

  38. return vediomassag

  39.  

  40. #将下载的m3u8文件放进创建的ts列表文件中

  41. def get_m3u8List(m3u8_url,vediomassag):

  42. lasturl = r'"m3u8_720_url":"(.*?)","download_url'

  43. last_url =re.findall(lasturl,vediomassag)

  44. lastURL=m3u8_url+str(last_url)

  45. response = requests.get(lastURL, headers=header)

  46. tsList = response.text

  47. cur_path='E:\\files' #在指定路径建立文件夹

  48. try:

  49. if not os.path.isdir(cur_path): #确认文件夹是否存在

  50. os.makedirs(cur_path) #不存在则新建

  51. except:

  52. print("文件夹存在")

  53. filename=cur_path+'\\t2.txt' #在文件夹中存放txt文件

  54. = open(filename,'a', encoding="utf-8")

  55. f.write(tsList)

  56. f.close

  57. print('创建%s文件成功'%(filename))

  58. return filename

  59.  

  60. # 提取ts列表文件的内容,逐个拼接ts的url,形成list

  61. def get_tsList(filename):

  62. ls = []

  63. with open(filename, "r") as file:

  64. line = f.readlines()

  65. for line in lines:

  66. if line.endswith(".ts\n"):

  67. ls.append(line[:-1])

  68. return ls

  69.  

  70.  

  71. # 批量下载ts文件

  72. def DownloadTs(ls):

  73. length = len(ls)

  74. root='E:\\mp4'

  75. try:

  76. if not os.path.exists(root):

  77. os.mkdir(root)

  78. except:

  79. print("文件夹创建失败")

  80. try:

  81. for i in range(length):

  82. tsname = ls[i][:-3]

  83. ts_URL=url+ls[i]

  84. print(ts_URL)

  85. = requests.get(ts_URL)

  86. with open(root, 'a') as f:

  87. f.write(r.content)

  88. f.close()

  89. print('\r' + tsname + " -->OK ({}/{}){:.2f}%".format(i, length, i * 100 / length), end='')

  90. print("下载完毕")

  91. except:

  92. print("下载失败")

  93.  

  94.  

  95. '''# 整合所有ts文件,保存为mp4格式(此处函数复制而来未做实验,本人直接在根目录

  96. 命令行输入copy/b*.ts 文件名.mp4,意思是将所有ts文件合并转换成自己命名的MP4格式

  97. 文件。)

  98. def MergeMp4():

  99. print("开始合并")

  100. path = "E://mp4//"

  101. outdir = "output"

  102. os.chdir(root)

  103. if not os.path.exists(outdir):

  104. os.mkdir(outdir)

  105. os.system("copy /b *.ts new.mp4")

  106. os.system("move new.mp4 {}".format(outdir))

  107. print("结束合并")'''

  108. if __name__ == '__main__':

  109. # 将获取的分类信息解码显示出来

  110. # print(json.loads(get_vediocategory(url, TimeStamp)))

  111. print(get_vediocategory(url, TimeStamp))

  112. tagID = input("请输入分类对应的id")

  113. print(get_vedioList(url, TimeStamp, tagID))

  114. vedioID = input("请输入视频对应的id")

  115. get_vediomassages(url, TimeStamp, vedioID)

  116. get_m3u8List(m3u8_url,vediomassag)

  117. get_tsList(filename)

  118. DownloadTs(ls)

  119. # MergeMp4()

此时正在下载

扫下方二维码加老师微信

或是搜索老师微信号:XTUOL1988【切记备注学习Python】

领取Python web开发,Python爬虫,Python数据分析,人工智能等学习教程。带你从零基础系统性的学好Python!

也可以加老师建的Python技术学习教程qq裙:245345507二者加一个就可以!

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

万水千山总是情,点个【在看】行不行

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜


good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter