网页视频抓取工具 知乎(如何爬视频我所用的图片皆为公开无版权的)
优采云 发布时间: 2022-03-20 00:02网页视频抓取工具 知乎(如何爬视频我所用的图片皆为公开无版权的)
潜水很久了知乎,这是我的第一篇文章知乎文章,如果有不对的地方请多多指教
自学爬虫一个多月,我是一名英语学习爱好者。突然想去ted看看怎么爬视频
我使用的图片都是公开的,无版权的图片网站--美丽免费图片| Unsplash 如有侵权,立即删除
1.使用的工具
requests 模块——爬虫的核心
urllib.request 模块 - 爬虫核心
BeautifulSoup 模块 - 解析器分析模块
re 模块 - 正则匹配
python版本3.6
2.网页分析
首先我们去实现我们的目标网站TED:值得传播的想法来分析我们要爬到的视频
进入会谈页面时,我们看到的页面是这样的
讲座共有72页
并发现其url地址的规律是
这样我们就可以轻松获取所有(36*72) 会谈视频)
3.进一步分析详情页
这个页面的分页就是我们要下载的内容。
随意点击进入详细视频页面,分析会谈页面与详细页面的关联
地雷的可怕逻辑——以及帮助人们避开地雷的应用程序
我们可以发现,详情页的url地址是TED 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 返回我们要抓取的内容
选择“html.parser”通过 BeautifulSoup 解析内容
通过标签的属性分析,发现收录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")
我们在此页面上没有找到他的下载链接
通过测试发现原来的下载链接隐藏在右上角的分享中
通过浏览器调试器发现链接的地址隐藏在js标签的中间界面中,在js的鼠标点击后渲染到div标签中,这样我们就可以不用模拟直接读取他的js标签了鼠标点击等待渲染然后爬取
5.re模块的正则匹配
element=soup.findAll("script")
patter=re.compile('http.*?mp4.apikey=.*?"')
stre=patter.findall(str(element))
打印完str的内容后,我们发现他有很多视频链接。我们点开,发现内容的不同是视频的分辨率不同。就个人而言,我更喜欢看高分辨率的视频,所以我再次对其进行过滤。
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.还有一件事
我已经将完整的代码 git 到我的 github。欢迎需要练习的朋友下载。如有不足请指出
github还有scrapy框架抓取动态网站unsplash下载图片
并使用phantomJS+selenium模拟浏览器行为抓取鸡网站数据并分析