看完这个爬虫教学视频,亲自实验了一下,提取视频关键内容,得出此文。

用不超过15行代码爬取百思不得姐网站上的视频:

爬取地址:http://www.budejie.com/video/

我需要下载的视频就是如下图所示:

这是video页面的一部分,每一页有20个视频,准备以下载前20页为例:

先分析一下第一页网页源代码,ctrl+F搜索"骑摩托穿梭于越南街头是种什么感受?",找到第一个视频的下载地址:(如下图所示)

下面编写代码,下载这个页面的所有"data-mp4=..."的视频

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re #正则
req = urllib2.Request('http://www.budejie.com/video') #请求页面
# 加一个键值对,针对服务器的反爬机制
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")
html = urllib2.urlopen(req).read()
reg = r'data-mp4="(.*?)"'  #r目的是以原生字符串转义,不会改变类似于"\n"这样的字符串
for i in re.findall(reg, html):  #找到视频地址
    filename = i.split("/")[-1]   #提取出文件名
    print "正在下载%s" %filename
    urllib.urlretrieve(i, "down_mp4/%s" %filename)  #下载
    print filename+"下载成功"
print "下载完成"
运行代码结果如下图:

那么第一页的20个视频都下载完成了,但是我希望下载前20页视频,所以把上面代码写成一个函数,调用20次就行了,每一次给函数传递页码就行了,因为百思不得姐的视频第二页的网址是

http://www.budejie.com/video/2
所以每次改变1-20就行了。

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re #正则
def getVideo(page):
    req = urllib2.Request('http://www.budejie.com/video/%s' %page)  #请求页面
    req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")
    html = urllib2.urlopen(req).read()
    reg = r'data-mp4="(.*?)"'  #正则表达式
    for i in re.findall(reg, html):  #找到视频地址
        filename = i.split("/")[-1]   #视频文件名
        print "正在下载%s" %filename
        urllib.urlretrieve(i, "down_mp4/%s" %filename)  #下载到与py文件同目录下的down_mp4文件夹
for i in range(1,21):  #以下载前20页为例
    getVideo(i)
运行代码结果如下图:

PS:本文仅用于爬虫实验,不用于盗取该网站视频,下载之后即删除。