看完这个爬虫教学视频,亲自实验了一下,提取视频关键内容,得出此文。
用不超过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:本文仅用于爬虫实验,不用于盗取该网站视频,下载之后即删除。