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爬蟲 |