標籤:

python爬蟲——下載ted視頻

鄙人長期知乎潛水,這是我的第一篇知乎文章,如有不好的地方請多指教

自學爬蟲一個月有餘,又是一個英語學習愛好者,突然心血來朝想去ted上面看下如何爬視頻

我所用的圖片皆為公開無版權的圖片網站--Beautiful Free Images | Unsplash 如有侵權立刪


1.所用工具

requests模塊 ——爬蟲核心

urllib.request模塊——爬蟲核心

BeautifulSoup模塊——parser分析模塊

re模塊——正則匹配

python版本3.6


2.網頁分析

首先我們先去我們的目標網站TED: Ideas worth spreading上分析我們所要爬去的視頻

進入talks頁面 我們所看見的頁面是這樣子的

talks一共有72頁

並且發現它的url地址的規律是

所以我們可以很簡單的拿到talks的所有(36*72)個視頻了


3.進一步分析詳細頁

這個頁面進去的分頁就是我們所要下載的內容了

隨意點擊進入詳細視頻頁面,分析talks頁與詳細頁面的關聯

The awful logic of land mines -- and an app that helps people avoid them

我們可以發現詳細頁面的url地址是TED Talks加上作者名字加標題,中間用「_」來分割組合的

這樣就可以很方便我們去talks頁面爬去視頻標題並將拼接成子頁面進一步爬取

接下來在瀏覽器中按下F12 打開調試器可以發現所有的標題都在這個節點之內並且它的href屬性提取出來


4.開始寫爬蟲

import requestsfrom bs4 import BeautifulSoupimport reimport urllib.requestnum=input("輸入要查找的ted的頁碼 1-72")url_page=https://www.ted.com/talks?page=%s%numted_page=requests.get(url_page).contentsoup=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.contentsoup=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=0def 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模擬瀏覽器行為爬取吃雞網站數據並且分析

推薦閱讀:

爬蟲 get 請求返回的內容是byte類型,如何轉為漢字?在線等
Python爬蟲:抓取今日頭條圖集
利用requests爬取表情包
Python爬蟲教程(一)使用request+Beautiful爬取妹子圖
三天學會用python進行簡單地爬取B站網頁視頻數據(一)

TAG:python爬蟲 |