爬蟲實習小結
這兩天找了個實習,名義是python工程師,其實就是寫爬蟲+整合到django。實習很奇葩,還有試用期的,現在試用期過了等後續安排,正好整理下這幾天寫爬蟲的一些心得體會。
首先,感覺寫爬蟲真的是個經驗活,一般的網站說白了就是不停往request裡試引數。直接爬不行加headers=試試,看有提交的表單就加個data=試試。這裡要區分下的是POST方法對應的是Form Data,可以通過request的data引數實現
request.post(data=data)
而GET方法對應的是Query String Parameters,一般採用拼接url的方法
base_url+urllib.urlencode(data)
至於提交表單的內容是什麼,就要靠自己看html的標籤或者js的函式得知,一般來說都能在html的原始碼裡搜尋到,可能是商品id,可能是頁面相對路徑的一部分,可能和時間相關,當然那些反爬網站提交的表單都是加密的,要想真正破解就要靠猜和試了。
然後對於一些需要模擬登入的網站,不需要驗證碼的話利用上面說的GET和POST表單應該就能解決,但有的網站還需要提供cookies,這時request就要包含cookies引數了。
requests.get(url, headers=header, cookies=cookie_dict)
而對於一些需要驗證碼登入的網站,也可以考慮先登入進去,然後複製下來登陸後的cookies,再利用其模仿登陸後的狀態,但這招不一定總能成功。
說到這裡突然想起之前爬學校能源網站查電費時,它一個非登入功能居然也要提供cookies才能成功響應,不知道是不是和框架有關,但總覺得好多此一舉...
最後想說,之前碰到爬不動的網站,就想用phantomjs+selenium,因為感覺理論上沒有這個方法爬不了的網站,但在實習時候就遇到了不行的情況,現在也沒搞懂為什麼。不過拋開個案不談,phantomjs雖然好用,可現在越發覺得用它就和作弊一樣,因為它就是個瀏覽器啊!個人用來爬少量資料還好,如果要爬商業用的大量資料request才是正道,畢竟用phantomjs比你直接用瀏覽器的效率都高不出哪裡去。
總之無論是headers,data還是cookies,爬蟲的精髓就是要儘可能的模模擬實瀏覽器的登入過程(知乎live 董偉明大大講的),但抓到的包裡有那麼多引數,完全加進去不可能也沒必要。至於具體使用哪些引數才能奏效,真的就要靠經驗了。據說有那種層層迭代的反爬方法?上一個接受包含下一個請求的引數,但這種連環套路我還沒有正是爬成功過,所以也不敢斷言。
最後好想吐槽下這個實習,糟糕的老闆(半懂不懂態度惡劣還固執僵硬),年幼的開發團隊(真正在做事的就兩個學生,一個異地的組長,一個半吊子的我...),混亂的程式碼管理(開發人員都是實習學生,更迭頻繁,導致程式碼風格迥異,可讀性健全性模組化都好差)。別說公司給不給留任,我自己都不想做了,但一想這是珍貴的第一份IT實習啊,就有不想放棄,哎呀,好煩。