很多時候在進行數據採集的時候,是需要登錄該網站的,這樣涉及到了表單登錄,你需要輸入用戶名密碼,還有驗證碼,多數情況我們在向一個靜態網站發起get請求就可以拿到其數據。但在需要提交登錄表單這種情況就需要用到post請求。除了提交用戶密碼之外,圖形驗證也是非常的複雜。
用一個實例來完成這些操作,保證百分之80的網站以後都能使用。我們用scrapy來建立一個爬蟲項目。
首先我們來分析一下網站的機制,輸入用戶名密碼,這肯定是你事先申請好的,然後點擊登錄,看Network登錄反應,
如圖所示,FormData裡面很清楚的看到了,登錄接口的URL,表單數據,從那個頁面登錄,登錄名,密碼,把它都複製下來。
拿到這些,我們需要在爬蟲裡去建立表單,發起請求。
這裡一定要注意的是,這個登錄請求的url不一樣的話,它的開發者模式裡面現實的也不一樣。所以要特別注意。
打開爬蟲py文件,寫代碼部分:
整個登錄表單代碼部分就完成了,其實沒那麼難,就是模擬用戶在一般情況下登錄一個網站所需輸入的東西,這裡只是用代碼來完成而已。
表單基本上可以看成一種用戶提交 POST 請求的方式,且這種請求方式是 Web 伺服器能夠理解和使用的。就像網站的連結標記可以幫助用戶發出 GET 請求一樣,HTML 表單可以幫助用戶發出 POST 請求。當然,我們也可以寫一點兒代碼來自己創建這些請求,然後通過網絡爬蟲把它們提交給伺服器。
大家有沒有發現我們的驗證碼captcha-id還沒有寫入表單裡面去,那這個captcha-id要怎麼得到呢?
分析開發者模式可以看到驗證碼,captcha_iD在name屬性下面,後面的value值是隨機填充的,需要用請求響應回來的rensponse拿到它。
就是用response.xpath 提取到我們的圖形驗證captcha-id。
這裡要強調一下,我們在登錄一個頁面的時候,如果第一次登錄成功是不會有驗證碼的,所以這裡必須有一個判斷,判斷在有沒有驗證碼的時候我們該怎麼去登錄。
然後yield scrapy.FormRequest(url=url,formdata=formdata,callback=self.parse(自己建立的回調處理函數))
在運行這個爬蟲的時候如果登錄成功,那麼網站的首頁就會展現在我們的面前,如果沒有就會報錯。
網頁表單是網絡惡意機器人(malicious bots)酷愛的網站切入點。你當然不希望機器人創建垃圾帳號,佔用昂貴的伺服器資源,或者在博客上提交垃圾評論。因此,現代網站經常在 HTML 中採取很多安全措施,讓表單不能被快速穿越。關於驗證碼(CAPTCHA)的作用,如果你在提交表單時遇到了一個莫名其妙的錯誤,或者伺服器一直以陌生的理由拒絕你,
當你不想讓自己的文字被網絡機器人抓取時,把文字做成圖片放在網頁上是常用的辦法。在聯繫人表單裡經常可以看到一個郵箱地址被部分或全部轉換成圖片。人們可能覺察不出明顯的差異,但是機器人閱讀這些圖片會非常困難,這種方法可以防止多數垃圾郵件發送器輕易地獲取你的郵箱地址。
當然,驗證碼(CAPTCHA)就利用了這種人類用戶可以正常讀取但是大多數機器人都無法讀取的圖片。驗證碼的讀取難度不同,有些驗證碼比其他的更加難讀,後面會介紹這個問題。
但是,驗證碼並不是網絡爬蟲抓取數據時需要進行圖像轉文字工作的唯一對象。即便是今天,仍然有很多文檔是掃描後直接放到網上的,它們無法直接使用,儘管「近在眼前」。如果無法將圖像轉為文字,要想使用這些文檔的內容,就只能人工手敲了,可沒人願意花時間幹這事兒。