我们已经知道了提交post请求的url,箭头所指的地方是提交的表单,里面的url就是我们要下载电影的ur,出现%3F这些是因为将url编码为了ASCII码,这里可能使用urllib对其进行解析,很简单;vkey需要我们获取,其实它就藏在Post请求之前get请求返回的页面中,vkey是动态变化的,每一次都不一样。红线部分是服务器返回的信息,前几天我爬取的时候里面的url还是电影的下载链接,现在变成了一个m3u8文件,里面的网址也是编码后的,我们需要用urllib进行解码,我们手动打开https://youku.cdn2-okzy.com/20200408/8808_23a9c669/index.m3u8看看里面的内容,下载后打开
发现里面并没有我们想要的ts文件,但是在文件中有一行1000k/hls/index.m3u8,也是以m3u8为后缀的,使用前面的url与文件中的部分地址拼接,结果为: https://youku.cdn2-okzy.com/20200408/8808_23a9c669/1000k/hls/index.m3u8,再次用浏览器手动打开,下载内容后发现里面是一个个ts文件,最后将ts文件下载后拼接即可(因为我爬的时候还是电影链接,写博客时发现改了,所以拼接方法我也不会,网上应该容易找到)。
下面我们只要获取vkey就可以得到这些ts文件地址了,我们向前看,找返回内容有vkey的get请求:
对比发现和post请求中的vkey一样,接下来就可以开始编写代码了。
代码实现
获取vkey,从上面的分析我们可以知道,get请求的网址为
https://www.administratorm.com/WANG.WANG/index.php?url=[要下载的xx电影]
我采用输入链接的方式来拼接get请求要访问的url,顺便使用urllib库将输入链接编码,方便后面的post请求使用
headers1 = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
'Referer':'无名小站'
}
headers2 = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
#定义接口链接
api_url = 'https://www.administratorm.com/WANG.WANG/Api.php'
input_url = input("请输入电影url链接:")
print("请稍等!")
get_key_url = '无名小站
parsed_url = parse.quote(input_url,safe='')
这里创建一个会话,会话是用于服务器记录用户身份的,然后就是发送get请求,获取网页源码,然后使用re匹配到vkey的内容,这里要注意的是get请求中的verify=False参数,其实我也不太明白,是一些网站有SSl认证,加了这个参数就可以跳过认证,加了此参数可能会有很多警告,使用 logging.captureWarnings(True) 设置不显示警告。
sess = requests.session()
vkey = get_key(sess,get_key_url)
def get_key(sess,get_key_url):
logging.captureWarnings(True)
response = sess.get(get_key_url,headers=headers1,verify=False)
response.encoding=response.apparent_encoding
content = response.text
vkey = re.findall('vkey.*?\'(.*?)\'',content)[0]
return vkey
制作表单,获取了vkey后,我们就可以制作提交post请求的表单了,代码很简单,就不做介绍了。
datas = make_dataform(parsed_url,vkey)
def make_dataform(parsed_url,vkey):
datas = {
'url':parsed_url,
'wap':'0',
'ios':'0',
'vkey':vkey,
'type':''
}
return datas
发送post请求,这里再次说明,由于我原来post请求返回的信息是电影下载地址,所以我获得的url是下载地址,现在再提交post请求获得的是m3u8文件。
download_url = post(sess,datas)
def post(sess,datas):
response = sess.post(api_url,headers=headers2,data=datas)
response.encoding=response.apparent_encoding
u = json.loads(response.text)
return u['url']
下载电影,由于链接不同,我就把我下载电影的代码放到这里,做个参考。
down_load(sess,download_url)
def down_load(sess,download_url):
print("正在准备下载电影")
response = requests.get(download_url,headers=headers2,verify=False)
total_size = response.headers['Content-Length']
print("将要下载的电影大小:{}MB".format(round(int(total_size)/1024/1024,2)))
batch_size = int(total_size)//100
#返回迭代器:是将二进制流按大小分割之后的
k = input("请输入文件路径(C/D):")
**(1)Python所有方向的学习路线(新版)**
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。

**(2)Python学习视频**
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

**(3)100多个练手项目**
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

**了解详情:https://docs.qq.com/doc/DSnl3ZGlhT1RDaVhV**