今天主要講講最近碰到的那個(gè)反爬網(wǎng)站,我當(dāng)時(shí)的心情真的是:

讓我們來(lái)回顧一下我們和這群正在招月薪3w反爬工程師網(wǎng)站的斗智斗勇。。。
事情是這樣的,首先我們開(kāi)了個(gè)大創(chuàng)項(xiàng)目,正好老師底下有個(gè)學(xué)生做畢設(shè)是做股權(quán)分析的,于是就順帶把我們現(xiàn)在做的這個(gè)大創(chuàng)項(xiàng)目就弄的和學(xué)長(zhǎng)做同一個(gè)方向了:目標(biāo)主要是爬取網(wǎng)站得到所有A股上市公司的股權(quán)信息。
當(dāng)時(shí)我們心情是:

組里兩個(gè)人都寫(xiě)過(guò)scrapy的爬蟲(chóng), 什么大風(fēng)大浪沒(méi)見(jiàn)過(guò)對(duì)吧(開(kāi)個(gè)玩笑)
不過(guò)這學(xué)長(zhǎng)是真坑啊,連著那網(wǎng)站也坑,兩坑加一起....
首先學(xué)長(zhǎng)都沒(méi)說(shuō)具體到底要爬哪些公司(一開(kāi)始都不知道是A股),一看到那網(wǎng)站,我們就懵逼了:

這東西只能搜索然后查找啊, 這..這..這...何從爬起啊?它根本都沒(méi)提供一個(gè)所有公司的展示界面?????

我們隨意搜了搜,看能不能找到全部公司:

哼哼看來(lái)人家又不傻....
緊接著看到了這個(gè):

當(dāng)時(shí)就懵逼了...這要是我們真有能力把它所有的公司都抓下來(lái),這個(gè)網(wǎng)站不就倒閉了...還搞個(gè)啥會(huì)員服務(wù)呢????!
果不其然,一位同學(xué)搜了搜招聘網(wǎng)站:

當(dāng)時(shí)心里頭萬(wàn)頭草泥馬奔涌而過(guò)啊...這我們拿著5000塊錢(qián)的資金,去跟一個(gè)企業(yè)一群月薪3W 的反爬工程師做斗爭(zhēng)呢?這還玩毛啊...還拖人家數(shù)據(jù)庫(kù),到時(shí)候會(huì)不會(huì)人家把你舉報(bào)了都不知道,算了算了,當(dāng)時(shí)想著學(xué)長(zhǎng)這畢設(shè)估計(jì)要 gg了...
但是沒(méi)辦法,該爬還得爬,怎么爬呢?我們準(zhǔn)備細(xì)心觀察每個(gè)企業(yè)的url結(jié)構(gòu):
結(jié)果是:
根本沒(méi)有任何規(guī)律
百度的url:http://www.tianyancha.com/company/22822
但是 http://www.tianyancha.com/company/22823 就沒(méi)有任何企業(yè)是這個(gè)url。
說(shuō)明一堆堆的企業(yè)好像被隨機(jī)分派在了0-100000000000(11個(gè)0)的范圍內(nèi)..
胖哥一聲令下:這還不簡(jiǎn)單,遍歷下就好了(單純的我們大概根本沒(méi)有這個(gè)概念:想把一個(gè)幾百十號(hào)人靠這個(gè)吃飯的數(shù)據(jù)庫(kù)拖下來(lái)哪能是我們?nèi)齻€(gè)單純的大三生能干的。。)
看了下網(wǎng)站結(jié)構(gòu),得開(kāi)啟selenium+phantomjs神器,于是,就開(kāi)始愉快地爬取啦??!
爬取的是很愉快,但是速度感人呀:
算了算,如果碰到url找不到企業(yè),大概是1秒1個(gè),如果url找得到企業(yè),抓取信息下來(lái)大概是5秒一個(gè),機(jī)智的我按了下計(jì)算器:
100000000000/3600/24/365 = 3000左右
臥槽,我們?cè)谝磺许樌那闆r下只需要爬3000年就可以爬完哦?。。?!3000年爬完哦?。。∨溃?!完??!哦?。?!

哇說(shuō)不定我們開(kāi)多個(gè)進(jìn)程,再搞個(gè)分布式可以縮短到100年呢,真是美滋滋...
而且“高興”到一半,突然爬蟲(chóng)GG了。。。
出現(xiàn)了圖片拖動(dòng)驗(yàn)證碼...
爬了十幾個(gè),就出現(xiàn)了圖片?驗(yàn)證?碼?
機(jī)智的胖哥立馬搜了搜相關(guān)方案:大致解決方法是模擬鼠標(biāo)去把那個(gè)圖片拖動(dòng)到合適位置(一句話就講完了看起來(lái)很簡(jiǎn)單的樣子)然后看了看那幾百行的代碼我們決定:!放棄!...
于是我們決定利用ip池來(lái)進(jìn)行爬取:隨便google了一下就找到了幾百個(gè)免費(fèi)的代理ip,方便的很.發(fā)現(xiàn)換了ip之后,終于可以跳過(guò)驗(yàn)證碼的驗(yàn)證界面了...松了一口氣,也就在這時(shí),學(xué)長(zhǎng)跟我們說(shuō),不用爬全部啊,主需要爬A股,讓我們的信心都為之一振!!
說(shuō)做就做,于是我們又開(kāi)始嗖嗖嗖地爬取:首先在網(wǎng)上得到A股名單,然后在天眼查搜索企業(yè),然后點(diǎn)擊進(jìn)去進(jìn)入該公司網(wǎng)站,然后開(kāi)始爬取!!
一切很順利,直到............
我們發(fā)現(xiàn),爬下來(lái),確實(shí)是沒(méi)什么問(wèn)題,但是....這數(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
來(lái)我們來(lái)看看原網(wǎng)站:

來(lái)我們來(lái)看看我們爬到了些啥:
工商注冊(cè)號(hào):440104113453756(這特么什么鬼)
行業(yè):消防(我要砸桌子了)
....
以下不列舉了...

我當(dāng)時(shí)只想:

這還玩?zhèn)€蛇皮...
大家開(kāi)始到網(wǎng)上搜尋解決方案, 我也趕緊問(wèn)了問(wèn)最近在知乎上捉到的@waking_up 一個(gè)自稱小白的大神, 結(jié)果三個(gè)人都無(wú)果而終....好像剩下的方法就只能試試抓包?
終于學(xué)長(zhǎng)在此時(shí)沒(méi)坑,給出了一波給你的助攻:換瀏覽器ua:
果然,在換取瀏覽器ua之后,千辛萬(wàn)苦我們終于可以爬到了真實(shí)數(shù)據(jù)!!
簡(jiǎn)直要喜極而泣..
然而...
我們發(fā)現(xiàn),當(dāng)我們直接訪問(wèn)例如:http://www.tianyancha.com/company/22822 網(wǎng)站時(shí), 給的是真實(shí)的數(shù)據(jù).然而,當(dāng)我們?yōu)榱伺炕幚? 是這樣的處理的:首先從網(wǎng)上獲取所有A股名單, 比如我們找到了百度, 然后我們?cè)谥黜?yè)利用webdriver模仿用戶行為:

搜索百度:
然后模仿用戶行為,點(diǎn)擊第一個(gè)鏈接:

之后,我們又GET了假數(shù)據(jù)!!!假!!數(shù)!!據(jù)!!!
此時(shí)內(nèi)心是崩潰的....
好氣啊,想砸桌子...
此時(shí)又發(fā)現(xiàn)消息: 學(xué)長(zhǎng)給的A股信息是假的,假的還不說(shuō)了,一些簡(jiǎn)稱在天眼查底下根本搜不到(比如"ST東北高")...

意思是即便我們用了合適的ua頭,但是只要利用phantomjs模仿用戶行為,比如點(diǎn)擊什么的,就會(huì)被偵測(cè)到!
無(wú)可奈何....
沒(méi)辦法本來(lái)也只是想把爬蟲(chóng)作為工具,并不是什么以后想要專門(mén)搞這個(gè)的,WEB基礎(chǔ)也不夠,就沒(méi)打算深究機(jī)理了....(也深刻感覺(jué)到了時(shí)間有限, 應(yīng)該把時(shí)間放在自己的那個(gè)方向上,其他只是作為工具而已,能利用就利用)
于是我重新google了下企業(yè)A股名單,然后發(fā)現(xiàn)雖然可能有些簡(jiǎn)稱搜不到,但是企業(yè)的編號(hào)是可以搜到的.在天眼查里搜編號(hào)就好了..
然后我們換用了移動(dòng)端的表頭:
驚喜地發(fā)現(xiàn)(終于這一次是驚喜了):移動(dòng)端沒(méi)有任何反爬措施,連驗(yàn)證碼都沒(méi)有!!!
所以也提個(gè)醒吧,如果發(fā)現(xiàn)WEB太難啃的話,直接把ua頭換移動(dòng)端就好了..
好了這是倒今天為止的進(jìn)度,具體項(xiàng)目完工后會(huì)寫(xiě)一篇正式的稿子的,這里只是記錄一下辛酸史= =真是心累啊.....不過(guò)也很佩服, 反爬與反反爬的過(guò)程還是很有趣的,仿佛是在斗智斗勇2333