Python爬虫实现vip电影下载

代码实现

获取vkey,从上面的分析我们可以知道,get请求的网址为

https://www.administratorm.com/WANG.WANG/index.php?url=[要下载的vip电影]

我采用输入链接的方式来拼接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‘:‘https://www.administratorm.com/index.php?url=https://v.qq.com/x/cover/mzc00200q06w7zx/j0033kbdjsv.html‘

}

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 = ‘https://www.administratorm.com/WANG.WANG/index.php?url=‘+input_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

2.制作表单,获取了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

3.发送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‘]

4.下载电影,由于链接不同,我就把我下载电影的代码放到这里,做个参考。

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):")

filename = input("请输入保存文件名:")

with open(r"{}:/电影/".format(k)+filename+".mp4",‘wb‘) as f:

i = 0

for content in response.iter_content(chunk_size=batch_size):

f.write(content)

print(‘\r‘,‘#‘*i+‘ 已下载{}%‘.format(i),end=‘\r‘,flush=True)

i += 1

print("下载成功")

相关推荐