鄙人长期知乎潜水,这是我的第一篇知乎文章,如有不好的地方请多指教
自学爬虫一个月有余,又是一个英语学习爱好者,突然心血来朝想去ted上面看下如何爬视频
1.所用工具
requests模块 ——爬虫核心
urllib.request模块——爬虫核心
BeautifulSoup模块——parser分析模块
re模块——正则匹配
python版本3.6
2.网页分析
进入talks页面 我们所看见的页面是这样子的
talks一共有72页
并且发现它的url地址的规律是
所以我们可以很简单的拿到talks的所有(36*72)个视频了
3.进一步分析详细页
这个页面进去的分页就是我们所要下载的内容了
随意点击进入详细视频页面,分析talks页与详细页面的关联
我们可以发现详细页面的url地址是TED Talks加上作者名字加标题,中间用“_”来分割组合的
这样就可以很方便我们去talks页面爬去视频标题并将拼接成子页面进一步爬取
接下来在浏览器中按下F12 打开调试器可以发现所有的标题都在这个节点之内并且它的href属性提取出来
4.开始写爬虫
import requests
from bs4 import BeautifulSoup
import re
import urllib.request
num=input("输入要查找的ted的页码 1-72")
url_page='https://www.ted.com/talks?page=%s'%num
ted_page=requests.get(url_page).content
soup=BeautifulSoup(ted_page,"html.parser")
cont=soup.findAll(attrs={"data-ga-context":"talks"})
ted_page返回的就是我们所要爬去的内容了
通过BeautifulSoup解析内容解析的方式选择“html.parser”
通过标签的属性分析发现其含有url地址的属性为data-ga-context=“talks”
得到的cont就是所有含有url地址的节点
由于我们发现他的每个视频下面都含有2个相同的视频地址
所以我们先随机提取一个值来进行测试
page=2 #假设我们提取第二个视频
raw_url = cont[page * 2]['href']
url='https://www.ted.com%s'%(raw_url) #拼接视频页
response=requests.get(url)
cont=response.content
soup=BeautifulSoup(cont,"html.parser")
我们并没有在这个页面找到他的下载链接
通过测试发现原来下载链接藏在了右上角的share里面
通过浏览器调试器发现链接的地址是藏在了js标签中间 界面是通过js的鼠标点击后 渲染到div标签中的 这样我们可以直接读取他的js标签 而不用模拟鼠标点击等待渲染后再爬取
5.re模块的正则匹配
element=soup.findAll("script")
patter=re.compile('http.*?mp4.apikey=.*?"')
stre=patter.findall(str(element))
打印stre的内容我们发现他有很多的视频链接 我们依次点开发现内容的差别就是视频的分辨率不同而已 我个人比较喜欢看分辨率高的视频所以再一次进行过滤
donwload_url=''
for _ in stre:
if "1500k" in _:
_=_.split('"')
donwload_url=_[0]
这样 download_url就是我们要的视频链接了
6.下载视频
urllib.request.urlretrieve(donwload_url, filename="ted.mp4", reporthook=Schedule)
调用urllib.request.urlretreieve模块来下载mp4格式的视频,保存在当前目录下
其中reporthook看名字就知道是一个返回下载进度的hook勾子函数
7.查看下载进度
第一函数Schedule
pre=0
def Schedule(a,b,c):
global pre
per = 100.0 * a * b / c
if int(per)-pre>0:
print('%.2f%%' % per)
pre=int(per)
这样会在下载进度每增加1%的时候打印一下进度 以便我们了解
8.one more thing
完整的代码我已经git到我的github上面了 需要练习的小伙伴欢迎下载 如有不足请指出
github还有scrapy框架爬取动态网站unsplash下载图片
以及使用phantomJS+selenium模拟浏览器行为爬取吃鸡网站数据并且分析