好友
阅读权限10
听众
最后登录1970-1-1
|
云卷~云舒
发表于 2017-6-21 22:40
最近一直在头条上面看关于Python的视频,可头条视频没有下载选项。通过浏览器自带的开发者工具(Google按F12)可以查看到视频的地址,并进行下载。这是手动下载,每回查看感觉还是比较费事,就想用Python写个代码,实现下载功能。顺便编了个简单的GUI,输入视频网页的地址,选择保存目录,实现视频下载功能。
开发环境:Window7、Python3.6,用PyCharm编写。
主要有两个Python文件,VideoDownloadGUI.py 主要是编写GUI的,VideoDownload.py主要是实现视频爬取下载的,下面直接上代码。
VideoDownload.py代码:
[Python] 纯文本查看 复制代码 from urllib import request
import re,random,binascii,json,base64,os
def VideoDownload(url,dir1):
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'www.toutiao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
r = request.Request(url, headers=headers)
html = request.urlopen(r)
htmlstr = html.read().decode() #将html转换成unicode字符串格式
#获取视频标题
pattern1 = re.compile(r'<title>(.+?)\ ') #\后面为空格,匹配<title>到空格之间的标题
video_title = re.findall(pattern1,htmlstr)[0]
#获取网页源码中的videoid
pattern2 = re.compile(r'videoid:\'(.+?)\'')
videoid = re.findall(pattern2,htmlstr)[0]
#crc32加密,获取访问json数据的链接
remoteURL = "http://ib.365yg.com/video/urls/v/1/toutiao/mp4/%s"%videoid
rand = str(random.random())[2:]
r = request.urlparse(remoteURL).path + '?r=' + rand
i = binascii.crc32(r.encode())
jsonURL = remoteURL + '?r=%s&s=%s'%(rand,i)
#获取视频地址
def getVideoURL(url):
h = request.urlopen(url)
hstr = h.read()
dictstr = json.loads(hstr)
video_list = dictstr['data']['video_list']
#main_url = dictstr['data']['video_list']['video_3']['main_url']
#video_list列表中可能没有第三种视频格式或可能有第四种视频格式
last = len(video_list)-1
main_url = video_list['video_%s'%last]['main_url']
return main_url
vUrl = getVideoURL(jsonURL)
videoURLreal = base64.b64decode(vUrl)
#下载视频文件
def downLoad(url):
path = dir1
file_name = video_title +'.mp4'
dest_dir = os.path.join(path,file_name)
request.urlretrieve(url.decode(),dest_dir)
downLoad(videoURLreal)
VideoDownloadGUI.py 代码:
[Python] 纯文本查看 复制代码 from tkinter import *
from tkinter.filedialog import askdirectory
from tkinter.messagebox import *
import VideoDownload
root = Tk()
root.title("头条视频下载")
var1 = StringVar()
var2 = StringVar()
#调用VideoDownload.py实现视频下载
def download():
url = var1.get()
VideoDownload.VideoDownload(url,var2.get())
showinfo(message="下载完成")
#获取保存目录
def callback():
global path
path = askdirectory()
var2.set(path)
label1 = Label(root,text = "输入视频地址:").grid(row = 0 ,sticky = W )
entry1 = Entry(root,textvariable = var1).grid(row = 0 ,column = 1)
label2 = Label(root,text = "选择保存位置:").grid(row = 1 ,sticky = W )
entry2 = Entry(root,textvariable = var2).grid(row = 1 ,column =1)
button2 = Button(root,text = "...",command = callback).grid(row = 1 ,column = 2 ,sticky = W)
button3 = Button(root,text = "下载",command = download).grid(row = 2 ,column = 2 ,sticky = W)
root.mainloop()
GUI效果图:
在视频地址栏里输入头条当前视频的网址,例如:http://www.toutiao.com/i6432258537992225282/;点击按钮
,选择保存目录;最后点击下载,下载完成后会提示“下载完成”。
在编写的过程中,也遇到很多问题,毕竟这是我写的第二个爬虫 。一般查书,一般网上搜相关资料,最终算是将代码写出来了,里面也还有许多不足的地方,请各位大神指点!!!
在写完代码试验时,遇到过一种情况,下载多次视频后,会提示错误,查了一遍,发现request无法爬取到url的代码 ,等第二天又可以爬取了。。。猜测可能跟网站的反爬虫之类的可能相关,可关键是,我一共也没爬几次 ,不是那种几百上千次的访问啊,反正是会有限制,请教各位大神指点迷津,这个该怎么弄比较好 。 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|