技術分享 | 用Python爬蟲進行網站數據獲取(II)
這是一篇許久之前跳票的文章,有幸在今天能夠補上,也得益於最近開始想通一些事情。如果沒過第一篇的可以點擊下面的鏈接先看看,本文默認大家已掌握python的基本語法及簡單的爬蟲技術。
點擊跳轉第一篇:用Python爬蟲進行網站數據獲取(I)
本次我們將講解一個登陸douban的爬蟲,包括驗證碼驗證,以及登陸後進行簡單數據爬取。
好了,事不宜遲,show me the code
首先我們需要了解一個背景知識,登陸網站,其實是提交一些數據給到伺服器,包括:用戶名和密碼,驗證碼,以及其他你看不到的數據。看不到的這部分數據因網站不同而異,但基本的套路會包含一個類似於id的數據,而且每次提交的值都不同,且在前端看不到的情況下進行提交。
第一步,我們在chrome上看一下登陸的頁面,以及觀察發現出一些前面講到的需要提交值。
https://www.douban.com/login這裡有個小技巧,不藉助fidler或者charles等抓包工具,直接登陸的話,看不到需要提交的數據。所以筆者估計輸入錯誤的驗證碼進行驗證。通過審查元素的login,就能看到需要提交的數據。
如上圖,可以發現其他隱藏的提交信息,其中:captcha-solution為驗證碼,captcha-id為隱藏的id值。
第二步,找到隱藏id和驗證碼提交。
解決驗證碼提交的問題。主流的方法有兩個,一是手動輸入,適用於新手且複雜程度並發量很低的爬蟲,我們介紹的是這種;二是利用ocr圖像識別技術,訓練數據後在一定的準確率下進行判斷,這種方法比較重,不適合初學者,有興趣的童鞋可以自己試試。
手動輸入,首先我們要看到驗證碼,然後再輸入。採用的方法是將驗證碼圖片下載到本地,使用時到對應的路徑去打開圖片後輸入,然後進行登陸表單的提交。
通過觀察我們可以發現驗證碼圖片都存儲這個路徑下,所以在解析頁面後找到這個路徑後就可以下載這個圖片了。
隱藏id的獲取比較簡單在源代碼下找到對應的id,然後動態的賦值到提交表單上即可。
#coding=utf-8 n#沒有上面這行輸入中文會報錯,注意nnimport requestsnfrom lxml import htmlnimport osnimport renimport urllib.requestnnlogin_url ="https://www.douban.com/login"ns = requests.session()nr = s.get(login_url)ntree = html.fromstring(r.text)nnel = tree.xpath(//input[@name="captcha-id"])[0]ncaptcha_id = el.attrib[value]n#獲取隱藏idnnel2 = tree.xpath(//img[@id="captcha_image"])[0]ncaptcha_image_url = el2.attrib[src]nimgPath = rE:imgnres=urllib.request.urlopen(captcha_image_url)nfilename=os.path.join(imgPath,"1"+.jpg)nwith open(filename,wb) as f:n f.write(res.read())n#保存驗證碼圖片nncaptcha_solution= input(請輸入驗證碼:)n
第三步,表單提交。
表單與第一步觀察得出的值一致。
運行結果如下:
好了,到這裡這個爬蟲也就完成了。預告下下一篇的內容,其實很多人都已經發現了api的數據獲取才是比較方便且穩定的做法,通過頁面爬蟲的做法,一來網頁結構會變,二來還需要和對方的反爬蟲機制鬥智斗勇。利用api的方式反而是一種便捷高速且高光正的做法。
題圖來源:@Unsplash
圖片授權基於:CC0協議
推薦閱讀:
※如何判斷瀏覽器post的是form data還是json data?
※pyspider 和 scrapy 比較起來有什麼優缺點嗎?
※Python 爬蟲如何機器登錄新浪微博並抓取內容?
※C#多線程發送http請求效率是否比python慢?
※python 中文url 編碼如何轉換回中文?