云卷~云舒 发表于 2017-6-21 22:40

用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:}。

云卷~云舒 发表于 2017-6-22 21:42

wanglaihuai 发表于 2017-6-22 15:43
requests库替换urllib~Requests: 让 HTTP 服务人类http://docs.python-requests.org/zh_CN/latest/index ...

回头试试看,谢啦

wanglaihuai 发表于 2017-6-22 15:43

云卷~云舒 发表于 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

用傲游不麻烦

云卷~云舒 发表于 2017-6-21 22:57

dandei 发表于 2017-6-21 22:51
用傲游不麻烦

一直在用Google。。。别的浏览器不太清楚

boyanuir 发表于 2017-6-21 23:08

可以用代{过}{滤}理试试,如果是scrapy框架可以在setting中设置一下爬虫的速度不要太快。selenium可以自动化抓取,但因为速度太慢一般不用。

wanglaihuai 发表于 2017-6-21 23:11

老板,用requests的话,代码会不会更少一点~

云卷~云舒 发表于 2017-6-21 23:45

boyanuir 发表于 2017-6-21 23:08
可以用代{过}{滤}理试试,如果是scrapy框架可以在setting中设置一下爬虫的速度不要太快。selenium可以自动 ...

这个回头试试看

云卷~云舒 发表于 2017-6-21 23:46

wanglaihuai 发表于 2017-6-21 23:11
老板,用requests的话,代码会不会更少一点~

呃呃呃,哪个requests

gowupu 发表于 2017-6-22 05:24

dandei 发表于 2017-6-22 07:29

gowupu 发表于 2017-6-22 05:24
傲游可以下载视频吗

一般的视频都可以下载

dandei 发表于 2017-6-22 07:36

云卷~云舒 发表于 2017-6-21 22:57
一直在用Google。。。别的浏览器不太清楚

一般的视频都可以下载。。{:1_921:}
页: [1] 2
查看完整版本: 用Python编写爬取头条视频的代码