网页视频抓取工具 知乎(如何爬视频我所用的图片皆为公开无版权的)

优采云 发布时间: 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_pa​​ge 返回我们要抓取的内容

  选择“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模拟浏览器行为抓取鸡网站数据并分析

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线