Python爬虫:爬取知乎上的视频,并把下载链接保存到md文件中
1.需要的Python模块
主要是requests模块,用于得到的网页的数据
安装命令为:pip install requests
2.具体实现过程
以爬取王者荣耀这个知乎站点上的视频为例。
我们首先来到王者荣耀官方知乎站点,点击视频,此时网址链接为:
https://www.zhihu.com/org/wang-zhe-rong-yao-74-54/zvideos 一直往下滑,发现下面有页数,点击来到第二页,此时网址链接为:
https://www.zhihu.com/org/wang-zhe-rong-yao-74-54/zvideos?page=2 因此第一页的网址链接应该为:
https://www.zhihu.com/org/wang-zhe-rong-yao-74-54/zvideos?page=1
此时选择这个网址,然后按电脑键盘F12键,来到开发者模式,点击network下面的xhr
可以发现,网页上的数据就在这个json数据里面,这个网址为:
https://www.zhihu.com/api/v4/members/wang-zhe-rong-yao-74-54/zvideos?offset=0&limit=20
通过不断换页发现,第2页的网页数据对应的接送网址为:
https://www.zhihu.com/api/v4/members/wang-zhe-rong-yao-74-54/zvideos?offset=20&limit=20
可以知道liimit应该是指视频的个数,而offset应该是页数,只不过页数应该是进行了一下除了罢了。
继续对这个json数据进行分析,发现这个下面有视频的下载链接:
那么怎样获取上述的那个json网址呢?其实就是字符串的拼接吧!
我们输入的网址为:https://www.zhihu.com/org/wang-zhe-rong-yao-74-54/zvideos?page=1
而这个json网址为:https://www.zhihu.com/api/v4/members/wang-zhe-rong-yao-74-54/zvideos?offset=0&limit=20
只需字符串的拼接即可。
3.参考代码和运行结果
参考代码为:
import requests
from crawlers.userAgent import useragent
import re
import json
import time
video_url=input("请输入视频界面的网址:")
userAgent=useragent()
headers={'user-agent':userAgent.getUserAgent()}
response=requests.get(url=video_url,headers=headers)
content=response.text # 网址的字符串
videos=int(re.findall('视频<span class="Tabs-meta">(\d+)</span>',content)[0]) # 总共的视频数量
print('总共视频个数为',videos)
page=0 # 页数
if videos%20==0:
page=videos//20
else:
page=videos//20+1
def formatStr(string:str):
string=string.replace('\n','')
strLength=len(string.strip())
if strLength==0:
return '空'
num=strLength//35+1
str1=''
for i in range(num):
str1+=string[i*35:(i+1)*35]+'\n'
return str1
print('总共页数为:',page)
# ajax_url='https://www.zhihu.com/api/v4/members/wang-zhe-rong-yao-74-54/zvideos?offset=0&limit=20'
ajaxUrl='https://www.zhihu.com/api/v4/members/'+video_url[video_url.find('/org/')+5:video_url.rfind('?')+1]+'offset={}&limit=20' # 拼接字符串
# 构造ajax构造的网址
file=input('请输入需要创建文件名称:')
filePath='./{}.md'.format(file)
f=open(file=filePath,mode='a',encoding='utf=8')
for i in range(page):
print('=======第{}页'.format(i+1))
ajaxUrl=ajaxUrl.format(i*20)
response1=requests.get(url=ajaxUrl,headers=headers)
dict1=json.loads(response1.text)
list1=dict1['data']
for list2 in list1:
title=list2['title']
descript1=list2['description']
print('-------【{}】--------'.format(title))
print('--->【描述】:%s'%formatStr(descript1))
f.write('## {}\n'.format(title))
f.write('<font face="华文新魏" size=4 color=red>{}</font>\n'.format(descript1.replace('\n','')))
downloadUrl=list2['video']['playlist']
print('-------视频大小有:')
for key in downloadUrl.keys():
downUrl=downloadUrl[key]['play_url']
print('{0}--width:{1},height:{2},下载链接为:[{3}]({3})'.format(key,downloadUrl[key]['width'],downloadUrl[key]['height'],downUrl))
f.write('<font face="华文新魏" size=4 color=blue>{},下载链接为:{}</font><br>'.format(key,downUrl))
f.write('============================================\n')
print('-='*40)
time.sleep(2)
f.close()
运行结果:
Python爬虫下载知乎上的视频
运行完成之后,会在运行文件的同一个文件夹下面多了一个md文件,视频的下载存储在这个文件里面,例外,小编在代码中导入了一个模块,那是小编自定义的,不了解的读者可以看看小编的这篇文章,文章链接为:Python爬虫:制作一个属于自己的IP代理模块
4.总结
因为有些视频很大,所以小编没有下载,知识输出视频的下载链接,另外,有的站点上的视频个数很多,小编不是不能把它们下载下来,而是觉得作为一个文明的爬虫,不能把相应的服务器造成很大的负担。小编正在参与CSDN新星计划。