Webdriver是一個自動化測試軟件,也是處理Ajax渲染之一的爬蟲工具。
本文以一個實際案例(今日頭條的陽光寬頻(365yg.com))來了解它有什么作用,它能做什么。相關的爬取思路也可應用在其他相類似的網站。
分析思路
第1步:首先進入https://365yg.com確定爬取的目標,本例爬取視頻的下載鏈接、視頻標題和作者
第2步:單擊鼠標右鍵選擇檢查或按鍵盤F12調出谷歌瀏覽器抓包工具進行分析
多次查看不同的視頻內容發現它們的視頻超鏈接、視頻標題和作者的網頁結構完全一樣,沒有反爬點,無需其他的處理
第3步:單擊鼠標右鍵選擇查看網頁源代碼查看是否被Ajax渲染
3.1從搜索結果上看該網頁很有可能已被Ajax渲染,但是仔細看發現下面這個區域有些關鍵字與我們需要的內容很相似,而且相關內容帶有\u****等字樣,有可能是將返回的中文轉化為Unicode!!
3.2復制部分內容進行驗證后發現盡管標題的內容與我們查找的標題不一樣,但可確定的是首頁沒有被Ajax渲染,請求返回的視頻標題、作者等信息會動態改變。
第4步:截止目前已解決爬取視頻標題和作者、接下來着手視頻的下載鏈接,接下來主要重復上面第1、第2、第3步
在瀏覽器中復制第2步獲取到的a標簽的鏈接並進入,使用與第2步相同的方式調取谷歌瀏覽器抓包工具進行分析,復制video標簽中的src屬性值的鏈接http://v3-default.ixigua.com/b4163b403a3374cbd32c3493907d4f79/5cfcf33b/video/m/並用瀏覽器打開
如圖所示視頻已加載出來,也就是說這個鏈接就是我們要找的視頻下載鏈接!!
第5步:別高興得太早,仔細想一下頭條的反爬就這么容易被攻破嗎?以第3步相同的方式查看該網頁的網頁源代碼,並在頁面查找video標簽中的src屬性值的鏈接http://v3-default.ixigua.com/b4163b403a3374cbd32c3493907d4f79/5cfcf33b/video/m/, 並沒有查找到內容,而且也無帶有\u****等字樣相關內容。
經Ajax渲染后的網頁代碼與網頁源代碼對比發現,網頁源代碼中缺少了視頻下載鏈接相關的內容,因此可確定這網頁是帶有Ajax渲染的。
因為我們使用requests或webdriver等獲取回來的網頁代碼就是網頁源代碼中相關的內容,如果我們直接使用webdriver進行解析標簽就會提示沒有找到該標簽,使用Xpath、BeautifulSoup或Re進行解析也是類似的結果
第6步:難道就沒有解決辦法嗎?上文有提及webdriver是處理Ajax渲染之一的爬蟲工具,那如果能控制webdriver像瀏覽器那樣等候ajax渲染后再獲取該網頁代碼不就可以獲取video標簽中的src屬性值的視頻下載鏈接了嗎?
沒錯,強大的webdriver提供了一個WebDriverWait方法提供多種顯式等候方法,調用相關方法就能控制webdriver進行不同條件的等候。
代碼實現思路
1.創建爬蟲類以及導入需要使用的包 -> 2.發送網絡請求並獲取首頁所有的視頻的鏈接、視頻標題和作者 -> 3.遍歷每個視頻播放鏈接並發送網絡請求 -> 4.進行延時等候直至視頻標簽加載出來 -> 5.解析視頻標簽獲取真實的視頻下載鏈接 -> 6.保存爬取的視頻鏈接等詳情
第1步:創建爬蟲類以及導入需要使用的包 ->
在爬蟲類的__init__方法中添加初始化url、User-Agent及創建webdriver對象
第2步:發送網絡請求並獲取首頁所有的視頻的鏈接、視頻標題和作者 ->
第3步:進行延時等候直至視頻標簽加載出來 -> 解析視頻標簽獲取真實的視頻下載鏈接 ->
第4步:保存爬取的視頻鏈接等詳情
第5步:將所有的方法封裝到start()方法,並調用start()方法運行爬蟲
查看運行結果
打開代碼運行后生成的csv文件,復制real_url列任意的url並在瀏覽器中打開
成功加載出視頻!!說明已通過代碼成功驗證爬取構思是正確的。
結果回顧
通過以上的代碼已能成功爬取陽光寬頻(365yg.com)的視頻,但僅有7個結果,而且爬取的real_url列的鏈接是有時效性,過一段時間就不能再訪問,如何爬取更多視頻(破解下滑加載視頻)、如何更高效地爬取視頻(爬得更多、更快)等就需要運用更多復雜的知識點、添加到上面的代碼來實現功能。