爬虫实习小结
這兩天找了個(gè)實(shí)習(xí),名義是python工程師,其實(shí)就是寫爬蟲+整合到django。實(shí)習(xí)很奇葩,還有試用期的,現(xiàn)在試用期過(guò)了等后續(xù)安排,正好整理下這幾天寫爬蟲的一些心得體會(huì)。
首先,感覺(jué)寫爬蟲真的是個(gè)經(jīng)驗(yàn)活,一般的網(wǎng)站說(shuō)白了就是不停往request里試參數(shù)。直接爬不行加headers=試試,看有提交的表單就加個(gè)data=試試。這里要區(qū)分下的是POST方法對(duì)應(yīng)的是Form Data,可以通過(guò)request的data參數(shù)實(shí)現(xiàn)
request.post(data=data)而GET方法對(duì)應(yīng)的是Query String Parameters,一般采用拼接url的方法
base_url+urllib.urlencode(data)至于提交表單的內(nèi)容是什么,就要靠自己看html的標(biāo)簽或者js的函數(shù)得知,一般來(lái)說(shuō)都能在html的源碼里搜索到,可能是商品id,可能是頁(yè)面相對(duì)路徑的一部分,可能和時(shí)間相關(guān),當(dāng)然那些反爬網(wǎng)站提交的表單都是加密的,要想真正破解就要靠猜和試了。
然后對(duì)于一些需要模擬登錄的網(wǎng)站,不需要驗(yàn)證碼的話利用上面說(shuō)的GET和POST表單應(yīng)該就能解決,但有的網(wǎng)站還需要提供cookies,這時(shí)request就要包含cookies參數(shù)了。
requests.get(url, headers=header, cookies=cookie_dict)而對(duì)于一些需要驗(yàn)證碼登錄的網(wǎng)站,也可以考慮先登錄進(jìn)去,然后復(fù)制下來(lái)登陸后的cookies,再利用其模仿登陸后的狀態(tài),但這招不一定總能成功。
說(shuō)到這里突然想起之前爬學(xué)校能源網(wǎng)站查電費(fèi)時(shí),它一個(gè)非登錄功能居然也要提供cookies才能成功響應(yīng),不知道是不是和框架有關(guān),但總覺(jué)得好多此一舉...
最后想說(shuō),之前碰到爬不動(dòng)的網(wǎng)站,就想用phantomjs+selenium,因?yàn)楦杏X(jué)理論上沒(méi)有這個(gè)方法爬不了的網(wǎng)站,但在實(shí)習(xí)時(shí)候就遇到了不行的情況,現(xiàn)在也沒(méi)搞懂為什么。不過(guò)拋開個(gè)案不談,phantomjs雖然好用,可現(xiàn)在越發(fā)覺(jué)得用它就和作弊一樣,因?yàn)樗褪莻€(gè)瀏覽器啊!個(gè)人用來(lái)爬少量數(shù)據(jù)還好,如果要爬商業(yè)用的大量數(shù)據(jù)request才是正道,畢竟用phantomjs比你直接用瀏覽器的效率都高不出哪里去。
總之無(wú)論是headers,data還是cookies,爬蟲的精髓就是要盡可能的模仿真實(shí)瀏覽器的登錄過(guò)程(知乎live 董偉明大大講的),但抓到的包里有那么多參數(shù),完全加進(jìn)去不可能也沒(méi)必要。至于具體使用哪些參數(shù)才能奏效,真的就要靠經(jīng)驗(yàn)了。據(jù)說(shuō)有那種層層迭代的反爬方法?上一個(gè)接受包含下一個(gè)請(qǐng)求的參數(shù),但這種連環(huán)套路我還沒(méi)有正是爬成功過(guò),所以也不敢斷言。
最后好想吐槽下這個(gè)實(shí)習(xí),糟糕的老板(半懂不懂態(tài)度惡劣還固執(zhí)僵硬),年幼的開發(fā)團(tuán)隊(duì)(真正在做事的就兩個(gè)學(xué)生,一個(gè)異地的組長(zhǎng),一個(gè)半吊子的我...),混亂的代碼管理(開發(fā)人員都是實(shí)習(xí)學(xué)生,更迭頻繁,導(dǎo)致代碼風(fēng)格迥異,可讀性健全性模塊化都好差)。別說(shuō)公司給不給留任,我自己都不想做了,但一想這是珍貴的第一份IT實(shí)習(xí)啊,就有不想放棄,哎呀,好煩。
總結(jié)
- 上一篇: JAVA 工厂模式计算器
- 下一篇: hscan扫描mysql代码_redis