想看下動漫《進擊的巨人》,發現處處被和諧,找不到資源,可是在一個視頻網站找到了在線播放,https://www.55cc.cc/dongman/17890/player-2-1.html,然而不能下載下來(喜歡的東西我通常都看不少遍)html
找了下,網站沒發現robots協議,加上我用的和真人瀏覽差很少的效率來爬取,應該ok的python
因而想爬蟲爬取下,可是看源代碼發現視頻是m3u8的ts流,並且是雙層m3u8的,而且m3u8地址還隱藏在js代碼中,因而有2種處理方法:web
1.直接requests源碼,把js代碼的部分逐字解析,找出m3u8地址。chrome
2.直接調用瀏覽器渲染,將渲染後的網頁代碼拿到,就能夠看到iframe標籤中src地址了json
獲取到首層m3u8地址後就簡單了,直接requests請求到第二層m3u8地址,這就是真實地址了,下載後能夠看到是不少的ts流小文件,因而有2種處理方法了:瀏覽器
1.直接逐個獲取ts地址,然而寫到本地磁盤的同一個文件,最後轉碼到mp4(ts格式太佔空間) bash
2.直接調用ffmpeg,能根據m3u8地址下載ts流併合併爲一個文件且同步轉碼爲mp4網絡
上述均採用第二種方法,因而寫出個簡單的該網站的視頻爬蟲併發
from selenium import webdriver from bs4 import BeautifulSoup import re import requests import os if __name__ == '__main__': urls = ['https://www.55cc.cc/dongman/17890/player-2-'+str(n)+'.html' for n in range(1,14,)] for url in urls: browser = webdriver.Firefox() browser.get(url) htmldata=browser.page_source browser.close() soup = BeautifulSoup(htmldata,'html.parser') m3u8 = re.findall(r'(https://\S+)',soup.select('iframe[name="iFrame_play"]')[0].get('src')[1::1])[0] r = requests.get(m3u8).text m3u8_rel = m3u8.replace('index.m3u8','')+re.split('\n',r)[-1] ffmpeg = '"C:\\soft\\ffmpeg\\bin\\ffmpeg.exe"' output = "f:\\進擊的巨人\\第三季\\"+soup.title.string.replace('集在線觀看_動漫_五五影院','').replace(' ','')+".mp4" cmd = ffmpeg+" -i "+m3u8_rel+" -vcodec copy -acodec copy "+output os.system(cmd)
每次都要啓動瀏覽器,有點兒膈應人,後面仍是改爲headless瀏覽器即無界面瀏覽器(無頭瀏覽器)來渲染app
12集都要順序執行下載,有點兒慢,後續改爲併發執行,一次性同步併發執行12條cmd命令來下載,即多進程方式
把共12集由原來的串行爬取改成並行爬取,增長效率
from selenium import webdriver from bs4 import BeautifulSoup import re import requests import os if __name__ == '__main__': urls = ['https://www.55cc.cc/dongman/17890/player-2-'+str(n)+'.html' for n in range(1,14,)] cmds = [] command = '' for url in urls: browser = webdriver.Firefox() browser.get(url) htmldata=browser.page_source browser.close() soup = BeautifulSoup(htmldata,'html.parser') m3u8 = re.findall(r'(https://\S+)',soup.select('iframe[name="iFrame_play"]')[0].get('src')[1::1])[0] r = requests.get(m3u8).text m3u8_rel = m3u8.replace('index.m3u8','')+re.split('\n',r)[-1] output = "f:\\進擊的巨人\\第三季\\"+soup.title.string.replace('集在線觀看_動漫_五五影院','').replace(' ','')+".mp4" cmd ="ffmpeg -i "+m3u8_rel+" -vcodec copy -acodec copy "+output cmds.append(cmd) #os.system(cmd) for i in cmds: command+='start cmd /c "'+i+'"&' os.system(command[:-1:])
嘗試過you-get來爬,不過好像很差用,也許是我菜
瀏覽器動態渲染 webkit;
python中動態網頁爬取方式:
dryscape 做者已經再也不維護了,而且做者推薦的庫僅是python2,已涼涼;
selenium 能夠,可是缺點是必需要打開瀏覽器;
Phantom JS,無頭瀏覽器 ,無界面瀏覽器, headless ,藉助之能夠模擬webkit執行,可是Phantom JS中止更新了且selenium不支持它了,也涼涼;
chrome headless 或者firefox headless能夠替代Phantom JS(建議使用,畢竟官方出品,比開源項目動不動有大坑,好比phantomjs坑1000+,或者沒人維護等等毛病)
puppeteer也能夠替代Phantom JS ,Pyppeteer是其python實現庫可是有問題不成熟,不建議用
tampermonkey油猴插件,自動交互,用js注入,能夠對網頁各類花式操做,好比給網頁注入個下載按鈕啥的(油猴能夠自動交互但很差監控網絡請求,chrome extension 能夠監控請求但無法監控響應,cdp 所有均可以作可是很差操做 dom)
cheerio 針對DOM的
appium是針對手機端的,通常因爲手機端性能問題,反爬策略較少,對於pc端實在無法子的,能夠從手機端操做
selenium被識別的程度愈來愈高,阿里的網站瞬間能識別,可是識別了並不會告訴你,而是返回給你和真人不同的結果
通常小型網站,直接webkit渲染便可,最簡單通用的方式是用 headless 的瀏覽器,徹底模擬人工操做,增大 IP 池,下降訪問評率。缺點是效率低,資源成本高
大型網站,是有價值去仔細分析的,通常都是先後分離,傳輸數據都是json,找到接口requests便可,可是對於加密的,直接請求又可能不行
無頭瀏覽器的資源佔用太多,能不用就不用