前面幾篇文章抓取的均是公開的資料,即沒有控制訪問許可權即可瀏覽的資料。但還是存在一些**(比如教學管理系統、內部論壇等),它會首先要求你登入,然後才能訪問到後續的內容。這種情況下,就要首先解決登入授信的問題。在開始編碼實現前,我們先了解下登入授信的原理。
cookie
那客戶端是如何拿到cookie的呢,下面是乙個流程圖。
如上圖所示,客戶端的cookie是**驗證你的登入請求成功後,在應答的set-cookie域裡面設定,客戶端收到後會記錄在本地,並在後續的請求中帶上。
所以,要實現模擬登入抓取資料,有兩個思路。一是我們的程式就要模擬上面流程圖的第3步和第4步,獲取乙個有效的cookie。二是先通過瀏覽器登入**獲取到cookie,再複製到我們的抓取指令碼中。這兩個方式各有優劣,下面我們依次來看下。
發包模擬登入
這是最正統的方法,指令碼完成後可以自動化執行,也不用擔心cookie過期等問題。但是就是技術門檻比較高,特別是帶驗證碼(特別是一些複雜驗證碼,如滑動拼圖,選擇等)的登入,非常難以實現。還有的在客戶端發包時就會對密碼進行加密(不依賴https),這樣就成為更難逾越的鴻溝。
我們以豆瓣網為例(因為它比較簡單),來介紹下scrapy框架如何實現登入。
首先是嘗試登入豆瓣網,利用f12開發者工具檢視請求送的字段。
下面我們開始編碼,編碼思路就是首先訪問豆瓣登入介面,再模擬傳送登入驗證post請求,登入成功後,再訪問賬戶個人訂單介面(帶上登入返回的cookie資訊),驗證cookie有效性。scrapy專案的生成以及常規前置工作在前面幾篇文章已詳細說明,這裡不再贅述。
如上圖所示,我們使用了formrequest構造了乙個post請求,請求字段就是我們在瀏覽器看到的。這裡注意要定義乙個特殊的meta元素cookiejar,meta是用於在請求應答中傳遞資料的字典,針對cookiejar這個特色鍵,scrapy會自動賦登入返回的cookie值,現在的初始值無所謂,我們填0
如上圖所示,登入後我們用乙個get請求訪問個人訂單頁,這裡就用上了meta裡的cookiejar的值,在新的請求包裡帶上了應答的cookie。scrapy執行輸出如下:
手動帶上cookie發包
手動帶上已知有效的cookie是一種最快捷的方式,很適合在臨時抓包或者驗證碼難以處理的情況下。缺點就是cookie容易過期,需要重新設定。如下圖所示我們首先用瀏覽器登入後訪問網頁,複製請求包裡的cookie字段值。
在爬蟲的settings.py檔案中,設定請求頭的cookie為複製的值,這裡要注意同步把cookies_enabled開關置為false,讓scrapy不再對cookie進行額外處理。
爬蟲的主體邏輯就非常簡單了,直接訪問需要爬取的頁面即可,不用其餘處理。
本文介紹了兩種模擬登入後爬取**資料的方法,對於模擬發包進行登入,由於驗證碼機制,難度會比較大,需要一定的技術深度。後面筆者還會推出掃碼登入、cas單點登入、自動驗證碼識別登入等文章,可以關注我不錯過後續精彩。賞個贊和推薦吧!
scrapy 爬取流程
什麼時候到pipeline,什麼 時候到spider這個就不說了,這個是框架跳轉到的流程 關鍵是訪問之前要登入怎麼辦,資料還要注入呢 這是個列表,裡面就是爬取的鏈結了 我們前面爬取就只是寫了乙個,但是其實可以寫多個 鏈結又是怎麼訪問的呢 這東西你就可以手動提取鏈結返回了 這東西你就得好好注意了 從入...
scrapy 爬取小說
速度是相當的快的 爬取整站的 最後結果儲存至mongodb資料庫 pycharm開發還是很好用的 建立專案 scrapy startproject daomubiji 執行專案 scrapy crawl daomubi settings default request headers items t...
scrapy爬取噹噹
import scrapy from items import dangdangitem class ddspider scrapy.spider name dd allowed domains dangdang.com start urls def parse self,response 使用xp...