用Python编写爬取头条视频的代码
最近一直在头条上面看关于Python的视频,可头条视频没有下载选项。通过浏览器自带的开发者工具(Google按F12)可以查看到视频的地址,并进行下载。这是手动下载,每回查看感觉还是比较费事:(eew,就想用Python写个代码,实现下载功能。顺便编了个简单的GUI,输入视频网页的地址,选择保存目录,实现视频下载功能。开发环境:Window7、Python3.6,用PyCharm编写。
主要有两个Python文件,VideoDownloadGUI.py 主要是编写GUI的,VideoDownload.py主要是实现视频爬取下载的,下面直接上代码。
VideoDownload.py代码:
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)
#获取网页源码中的videoid
pattern2 = re.compile(r'videoid:\'(.+?)\'')
videoid = re.findall(pattern2,htmlstr)
#crc32加密,获取访问json数据的链接
remoteURL = "http://ib.365yg.com/video/urls/v/1/toutiao/mp4/%s"%videoid
rand = str(random.random())
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 代码:
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/;点击按钮,选择保存目录;最后点击下载,下载完成后会提示“下载完成”。
在编写的过程中,也遇到很多问题,毕竟这是我写的第二个爬虫:keai。一般查书,一般网上搜相关资料,最终算是将代码写出来了,里面也还有许多不足的地方,请各位大神指点!!!
在写完代码试验时,遇到过一种情况,下载多次视频后,会提示错误,查了一遍,发现request无法爬取到url的代码{:1_885:},等第二天又可以爬取了。。。猜测可能跟网站的反爬虫之类的可能相关,可关键是,我一共也没爬几次:'(weeqw,不是那种几百上千次的访问啊,反正是会有限制,请教各位大神指点迷津,这个该怎么弄比较好{:1_893:}。 wanglaihuai 发表于 2017-6-22 15:43
requests库替换urllib~Requests: 让 HTTP 服务人类http://docs.python-requests.org/zh_CN/latest/index ...
回头试试看,谢啦 云卷~云舒 发表于 2017-6-21 23:46
呃呃呃,哪个requests
requests库替换urllib~Requests: 让 HTTP 服务人类http://docs.python-requests.org/zh_CN/latest/index.html 用傲游不麻烦 dandei 发表于 2017-6-21 22:51
用傲游不麻烦
一直在用Google。。。别的浏览器不太清楚 可以用代{过}{滤}理试试,如果是scrapy框架可以在setting中设置一下爬虫的速度不要太快。selenium可以自动化抓取,但因为速度太慢一般不用。 老板,用requests的话,代码会不会更少一点~ boyanuir 发表于 2017-6-21 23:08
可以用代{过}{滤}理试试,如果是scrapy框架可以在setting中设置一下爬虫的速度不要太快。selenium可以自动 ...
这个回头试试看 wanglaihuai 发表于 2017-6-21 23:11
老板,用requests的话,代码会不会更少一点~
呃呃呃,哪个requests gowupu 发表于 2017-6-22 05:24
傲游可以下载视频吗
一般的视频都可以下载 云卷~云舒 发表于 2017-6-21 22:57
一直在用Google。。。别的浏览器不太清楚
一般的视频都可以下载。。{:1_921:}
页:
[1]
2