吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9112|回复: 14
收起左侧

[Python 转载] 用Python编写爬取头条视频的代码

  [复制链接]
云卷~云舒 发表于 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效果图:

GUI.PNG


        在视频地址栏里输入头条当前视频的网址,例如:http://www.toutiao.com/i6432258537992225282/;点击按钮 按钮.PNG ,选择保存目录;最后点击下载,下载完成后会提示“下载完成”。


        在编写的过程中,也遇到很多问题,毕竟这是我写的第二个爬虫。一般查书,一般网上搜相关资料,最终算是将代码写出来了,里面也还有许多不足的地方,请各位大神指点!!!

        在写完代码试验时,遇到过一种情况,下载多次视频后,会提示错误,查了一遍,发现request无法爬取到url的代码,等第二天又可以爬取了。。。猜测可能跟网站的反爬虫之类的可能相关,可关键是,我一共也没爬几次,不是那种几百上千次的访问啊,反正是会有限制,请教各位大神指点迷津,这个该怎么弄比较好

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wanglaihuai + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 云卷~云舒 发表于 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
dandei 发表于 2017-6-21 22:51
 楼主| 云卷~云舒 发表于 2017-6-21 22:57

一直在用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。。。别的浏览器不太清楚

一般的视频都可以下载。。
snap_screen_20170622073534.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 20:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表