今天主要講講最近碰到的那個(gè)反爬網(wǎng)站挨约,我當(dāng)時(shí)的心情真的是:
讓我們來回顧一下我們和這群正在招月薪3w反爬工程師網(wǎng)站的斗智斗勇叉橱。胖烛。眼姐。
事情是這樣的诅迷,首先我們開了個(gè)大創(chuàng)項(xiàng)目,正好老師底下有個(gè)學(xué)生做畢設(shè)是做股權(quán)分析的众旗,于是就順帶把我們現(xiàn)在做的這個(gè)大創(chuàng)項(xiàng)目就弄的和學(xué)長做同一個(gè)方向了:目標(biāo)主要是爬取網(wǎng)站得到所有A股上市公司的股權(quán)信息竟贯。
當(dāng)時(shí)我們心情是:
組里兩個(gè)人都寫過scrapy的爬蟲, 什么大風(fēng)大浪沒見過對吧(開個(gè)玩笑)
不過這學(xué)長是真坑啊逝钥,連著那網(wǎng)站也坑屑那,兩坑加一起....
首先學(xué)長都沒說具體到底要爬哪些公司(一開始都不知道是A股),一看到那網(wǎng)站艘款,我們就懵逼了:
這東西只能搜索然后查找啊持际, 這..這..這...何從爬起啊哗咆?它根本都沒提供一個(gè)所有公司的展示界面爸┯?晌柬?姥份?
我們隨意搜了搜,看能不能找到全部公司:
哼哼看來人家又不傻....
緊接著看到了這個(gè):
當(dāng)時(shí)就懵逼了...這要是我們真有能力把它所有的公司都抓下來年碘,這個(gè)網(wǎng)站不就倒閉了...還搞個(gè)啥會(huì)員服務(wù)呢澈歉??S煨啤埃难!
果不其然,一位同學(xué)搜了搜招聘網(wǎng)站:
當(dāng)時(shí)心里頭萬頭草泥馬奔涌而過啊...這我們拿著5000塊錢的資金涤久,去跟一個(gè)企業(yè)一群月薪3W 的反爬工程師做斗爭呢涡尘?這還玩毛啊...還拖人家數(shù)據(jù)庫,到時(shí)候會(huì)不會(huì)人家把你舉報(bào)了都不知道响迂,算了算了考抄,當(dāng)時(shí)想著學(xué)長這畢設(shè)估計(jì)要 gg了...
但是沒辦法,該爬還得爬蔗彤,怎么爬呢川梅?我們準(zhǔn)備細(xì)心觀察每個(gè)企業(yè)的url結(jié)構(gòu):
結(jié)果是:
根本沒有任何規(guī)律
百度的url:http://www.tianyancha.com/company/22822
但是 http://www.tianyancha.com/company/22823 就沒有任何企業(yè)是這個(gè)url。
說明一堆堆的企業(yè)好像被隨機(jī)分派在了0-100000000000(11個(gè)0)的范圍內(nèi)..
胖哥一聲令下:這還不簡單幕与,遍歷下就好了(單純的我們大概根本沒有這個(gè)概念:想把一個(gè)幾百十號人靠這個(gè)吃飯的數(shù)據(jù)庫拖下來哪能是我們?nèi)齻€(gè)單純的大三生能干的挑势。。)
看了下網(wǎng)站結(jié)構(gòu)啦鸣,得開啟selenium+phantomjs神器潮饱,于是,就開始愉快地爬取啦=敫香拉!
爬取的是很愉快啦扬,但是速度感人呀:
算了算,如果碰到url找不到企業(yè)凫碌,大概是1秒1個(gè)扑毡,如果url找得到企業(yè),抓取信息下來大概是5秒一個(gè)盛险,機(jī)智的我按了下計(jì)算器:
100000000000/3600/24/365 = 3000左右
臥槽瞄摊,我們在一切順利的情況下只需要爬3000年就可以爬完哦!?嗑颉;恢摹!3000年爬完哦:追取9咄铡!爬5莨濉祟牲!完!抖部!哦K当础!您朽!
哇說不定我們開多個(gè)進(jìn)程狂丝,再搞個(gè)分布式可以縮短到100年呢换淆,真是美滋滋...
而且“高興”到一半哗总,突然爬蟲GG了。倍试。讯屈。
出現(xiàn)了圖片拖動(dòng)驗(yàn)證碼...
爬了十幾個(gè),就出現(xiàn)了圖片?驗(yàn)證?碼?
機(jī)智的胖哥立馬搜了搜相關(guān)方案:大致解決方法是模擬鼠標(biāo)去把那個(gè)圖片拖動(dòng)到合適位置(一句話就講完了看起來很簡單的樣子)然后看了看那幾百行的代碼我們決定:!放棄!...
于是我們決定利用ip池來進(jìn)行爬取:隨便google了一下就找到了幾百個(gè)免費(fèi)的代理ip,方便的很.發(fā)現(xiàn)換了ip之后,終于可以跳過驗(yàn)證碼的驗(yàn)證界面了...松了一口氣,也就在這時(shí),學(xué)長跟我們說,不用爬全部啊,主需要爬A股,讓我們的信心都為之一振!!
說做就做,于是我們又開始嗖嗖嗖地爬取:首先在網(wǎng)上得到A股名單,然后在天眼查搜索企業(yè),然后點(diǎn)擊進(jìn)去進(jìn)入該公司網(wǎng)站,然后開始爬取!!
一切很順利,直到............
我們發(fā)現(xiàn),爬下來,確實(shí)是沒什么問題,但是....這數(shù)據(jù)特么是個(gè)假的!!!假...的....假...的....
如下是爬到假數(shù)據(jù)的代碼:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS) # 設(shè)置userAgent
dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0")
obj = webdriver.PhantomJS(executable_path=r"/home/jack/Downloads/App/phantomjs-2.1.1-linux-x86_64/bin/phantomjs", desired_capabilities=dcap)
obj.get('http://www.tianyancha.com/company/22822')
time.sleep(3)
print obj.page_source
來我們來看看原網(wǎng)站:
來我們來看看我們爬到了些啥:
工商注冊號:440104113453756(這特么什么鬼)
行業(yè):消防(我要砸桌子了)
....
以下不列舉了...
我當(dāng)時(shí)只想:
這還玩?zhèn)€蛇皮...
大家開始到網(wǎng)上搜尋解決方案, 我也趕緊問了問最近在知乎上捉到的@waking_up 一個(gè)自稱小白的大神, 結(jié)果三個(gè)人都無果而終....好像剩下的方法就只能試試抓包?
終于學(xué)長在此時(shí)沒坑,給出了一波給你的助攻:換瀏覽器ua:
果然,在換取瀏覽器ua之后,千辛萬苦我們終于可以爬到了真實(shí)數(shù)據(jù)!!
簡直要喜極而泣..
然而...
我們發(fā)現(xiàn),當(dāng)我們直接訪問例如:http://www.tianyancha.com/company/22822 網(wǎng)站時(shí), 給的是真實(shí)的數(shù)據(jù).然而,當(dāng)我們?yōu)榱伺炕幚? 是這樣的處理的:首先從網(wǎng)上獲取所有A股名單, 比如我們找到了百度, 然后我們在主頁利用webdriver模仿用戶行為:
搜索百度:
然后模仿用戶行為,點(diǎn)擊第一個(gè)鏈接:
之后,我們又GET了假數(shù)據(jù)!!!假!!數(shù)!!據(jù)!!!
此時(shí)內(nèi)心是崩潰的....
好氣啊,想砸桌子...
此時(shí)又發(fā)現(xiàn)消息: 學(xué)長給的A股信息是假的,假的還不說了,一些簡稱在天眼查底下根本搜不到(比如"ST東北高")...
意思是即便我們用了合適的ua頭,但是只要利用phantomjs模仿用戶行為,比如點(diǎn)擊什么的,就會(huì)被偵測到!
無可奈何....
沒辦法本來也只是想把爬蟲作為工具,并不是什么以后想要專門搞這個(gè)的,WEB基礎(chǔ)也不夠,就沒打算深究機(jī)理了....(也深刻感覺到了時(shí)間有限, 應(yīng)該把時(shí)間放在自己的那個(gè)方向上,其他只是作為工具而已,能利用就利用)
于是我重新google了下企業(yè)A股名單,然后發(fā)現(xiàn)雖然可能有些簡稱搜不到,但是企業(yè)的編號是可以搜到的.在天眼查里搜編號就好了..
然后我們換用了移動(dòng)端的表頭:
驚喜地發(fā)現(xiàn)(終于這一次是驚喜了):移動(dòng)端沒有任何反爬措施,連驗(yàn)證碼都沒有!!!
所以也提個(gè)醒吧,如果發(fā)現(xiàn)WEB太難啃的話,直接把ua頭換移動(dòng)端就好了..
好了這是倒今天為止的進(jìn)度,具體項(xiàng)目完工后會(huì)寫一篇正式的稿子的,這里只是記錄一下辛酸史= =真是心累啊.....不過也很佩服, 反爬與反反爬的過程還是很有趣的,仿佛是在斗智斗勇2333