小科普:數(shù)據(jù)爬蟲究竟是在干啥
今天有個(gè)小目標(biāo):用一個(gè)網(wǎng)站實(shí)例來(lái)做展示,給大家科普下數(shù)據(jù)爬蟲工作的過(guò)程。不知道最終效果如何,如果你能看到最后,不妨評(píng)論下你的感受。
了解任務(wù)
首先,選定的網(wǎng)站是 愛爾眼科官網(wǎng)?https://www.aierchina.com/



通常,醫(yī)院官網(wǎng)比較有價(jià)值的數(shù)據(jù)是它在全國(guó)各城市的醫(yī)院門店信息,比如我選擇主頁(yè)上的【找醫(yī)院】-【山東省】-【東營(yíng)】,便會(huì)進(jìn)入東營(yíng)市醫(yī)院信息頁(yè)面:



選擇后省份、城市后,瀏覽器會(huì)跳轉(zhuǎn)到:
https://www.aierchina.com/hospital/shandong/dongying.html



該頁(yè)面上所有醫(yī)院的地址、項(xiàng)目、時(shí)間等信息數(shù)據(jù),便是我們想要獲取的有價(jià)值信息。
到這里,我們的任務(wù)目標(biāo)就比較明確了:將愛爾眼科官網(wǎng)上所有省份城市的醫(yī)院數(shù)據(jù)全部下載下來(lái)。
設(shè)計(jì)方法
如果完全不懂代碼編程,那么完成上面的任務(wù),就是手動(dòng)一個(gè)個(gè)選擇各個(gè)城市、進(jìn)入所有城市醫(yī)院信息的頁(yè)面,然后將每家醫(yī)院的信息復(fù)制、粘貼到表格中。
愛爾眼科網(wǎng)站展示的醫(yī)院數(shù)目約 450 多條,順利的話,手動(dòng)能幾天內(nèi)搞定。
那么如果想用代碼來(lái)自動(dòng)化實(shí)現(xiàn)上面的過(guò)程,要怎么操作呢?
首先你要知道,網(wǎng)站頁(yè)面上展示的所有信息,其實(shí)是在你輸入網(wǎng)址、敲下回車之后,瀏覽器發(fā)出了請(qǐng)求、接收到返回信息、再展示給你的。
那么代碼編程,就可以不用再去打開瀏覽器、輸入網(wǎng)址敲回車,而是直接通過(guò)代碼來(lái)直接發(fā)送請(qǐng)求。
原本是瀏覽器接收到返回信息,再展現(xiàn)給我們;代碼編程就可以拿到返回的信息,直接對(duì)這些信息處理、提取關(guān)鍵數(shù)據(jù)。
回歸到愛爾眼科官網(wǎng),我們首先需要獲取到每個(gè)城市頁(yè)面對(duì)應(yīng)的網(wǎng)址,然后在城市頁(yè)面上提取展示的醫(yī)院信息。
城市網(wǎng)址
剛有說(shuō)代碼會(huì)直接發(fā)送請(qǐng)求來(lái)獲取網(wǎng)站返回的信息,怎么理解呢?可以在任意網(wǎng)站上【點(diǎn)擊鼠標(biāo)右鍵】-【查看網(wǎng)頁(yè)源代碼】,這里展示的與網(wǎng)站返回信息比較接近了。
比如,愛爾眼科官網(wǎng)首頁(yè)-查看網(wǎng)頁(yè)源代碼,向下拉到大概 600 多行:



基本每個(gè)城市對(duì)應(yīng)一個(gè)網(wǎng)址,看著特別像所有城市的網(wǎng)址。暫且先把它當(dāng)成我們第一步要用代碼提取的信息,OK,我們現(xiàn)在已經(jīng)拿到了所有城市對(duì)應(yīng)的城市頁(yè)面網(wǎng)址了。
醫(yī)院數(shù)據(jù)
拿到了城市頁(yè)面的網(wǎng)址,我們也可以通過(guò)【網(wǎng)頁(yè)源代碼】查找其中醫(yī)院信息:



用代碼將其中所有醫(yī)院數(shù)據(jù)提取出來(lái),我們便完成了對(duì)一個(gè)城市所有醫(yī)院信息的抓取數(shù)據(jù)工作。
既然一個(gè)城市的抓數(shù)流程走通了,便可以對(duì)之前提取到的所有城市網(wǎng)址鏈接都進(jìn)行同樣的流程,從而獲取到所有城市的醫(yī)院數(shù)據(jù)了。
代碼編程
梳理出上面的思路,最重要的便是寫代碼來(lái)實(shí)現(xiàn)整個(gè)過(guò)程了。這里我不展開具體代碼邏輯,之前我自學(xué) Python 時(shí)覺得用 Python 寫爬蟲比較輕松,工作里接觸到 NodeJS 爬蟲,對(duì)比著會(huì)覺得其它編程語(yǔ)言來(lái)寫爬蟲也沒有那么麻煩。
所以只要合適、自己能上手,選擇什么編程語(yǔ)言其實(shí)沒那么重要,只不過(guò)換了種語(yǔ)法來(lái)把我們?cè)O(shè)計(jì)的流程實(shí)現(xiàn)罷了。
改 Bug
如果身邊有程序員朋友,可能會(huì)經(jīng)常聽到他們說(shuō)【改 Bug】,那究竟啥是【改 Bug】呢?
Bug,漏洞,也就是代碼中錯(cuò)誤的地方。
而我,恰好在愛爾眼科官網(wǎng)首頁(yè)上,就發(fā)現(xiàn)了不少問(wèn)題,也就是剛提到的不少 Bug。
如果你有在愛爾眼科上班的朋友,可以順手把這些問(wèn)題轉(zhuǎn)給他看了。
剛我們?cè)谑醉?yè)的【網(wǎng)頁(yè)源代碼】中找到了各個(gè)城市對(duì)應(yīng)的網(wǎng)址鏈接,其實(shí)這里面的上百條鏈接中,有13條拼寫錯(cuò)誤:



看代碼可能比較頭大,可以在手機(jī)端訪問(wèn)? https://www.aierchina.com/?打開愛爾眼科官網(wǎng),點(diǎn)擊右上角的選擇定位按鈕,選到首字母 B 的蚌埠(或者首字母 C 的池州,總共有 13 個(gè)城市會(huì)報(bào)錯(cuò))


共有13個(gè)城市的鏈接有問(wèn)題,原因部分是拼寫錯(cuò)誤、部分是省份和城市拼接錯(cuò)誤,比如原本山東臨沂錯(cuò)拼成 shanxi/linyi,再比如陜西西安拼成 shanxixi/xian,還挺潮的,陜西西。
這些由于程序員寫代碼時(shí)造成的錯(cuò)誤,就是常說(shuō)的 Bug 漏洞的一些例子,而改 Bug 就是將這些錯(cuò)誤改正,使得用戶使用時(shí)頁(yè)面可以正常跳轉(zhuǎn)。
抓數(shù)優(yōu)化
剛我們梳理了整個(gè)抓取數(shù)據(jù)的過(guò)程,定位到錯(cuò)誤的城市網(wǎng)址并進(jìn)行改正,理論上應(yīng)該能拿到所有城市醫(yī)院數(shù)據(jù)了。
但是,官網(wǎng)首頁(yè)代碼中的城市鏈接是不全的,直接體現(xiàn)就是手機(jī)端訪問(wèn)愛爾眼科官網(wǎng),城市列表比電腦端可選的要少。
既然有遺漏,那么我們就沒有把城市抓全,自然就要去檢查缺了哪些然后去補(bǔ)上。
我第一遍抓取這網(wǎng)站的時(shí)候,就是遇到了這個(gè)坑。
細(xì)心的話,你應(yīng)該也發(fā)現(xiàn)了,電腦端展示省份和城市的方式,和手機(jī)端展示城市的列表方式,是有些差別的。
是的,換句話說(shuō),剛我們遇到的問(wèn)題、Bug,來(lái)自于移動(dòng)端所依賴的城市網(wǎng)址們。
想要完全解決這個(gè)問(wèn)題,我們需要從電腦端選擇省份、城市的方式上去找思路。
最終,我也是在網(wǎng)站返回的數(shù)據(jù)中,找到了相關(guān)省份城市的數(shù)據(jù),它沒有直接展現(xiàn)在頁(yè)面上,而是藏在了 JS 代碼中,從而拿到了完整的城市網(wǎng)址數(shù)據(jù)。



拿到完整的城市網(wǎng)址數(shù)據(jù),便解決了遺漏城市的問(wèn)題,我們的抓取所有城市醫(yī)院數(shù)據(jù)的任務(wù)才算圓滿完成。
最終把得到的數(shù)據(jù)寫到 Excel 表格中,大致樣子如下:



總結(jié)
看到這,如果對(duì)編程不感興趣,我猜你已經(jīng)覺得麻煩了吧。
在上面的抓取數(shù)據(jù)過(guò)程中,我們用代碼編寫的程序,像是一個(gè)個(gè)蜘蛛(爬蟲),在網(wǎng)絡(luò)上去獲取我們想要的數(shù)據(jù)——也因此,抓取數(shù)據(jù)又被稱為爬蟲、爬取數(shù)據(jù)。
但上面描述的過(guò)程,全部都沒有提及編寫代碼來(lái)實(shí)現(xiàn)這個(gè)過(guò)程,其實(shí)這個(gè)才是程序員實(shí)際的勞動(dòng),其中也會(huì)有各種細(xì)節(jié)要處理,去發(fā)現(xiàn)并解決各種 Bug。
看到這,應(yīng)該能理解為什么高級(jí)程序員都是絕頂聰明了吧。
而上面描述的這個(gè)抓取數(shù)據(jù)的任務(wù),只能算初級(jí)難度的爬蟲任務(wù),因?yàn)樵谡麄€(gè)過(guò)程中,網(wǎng)站并沒有對(duì)我們做限制、我們提取數(shù)據(jù)的過(guò)程也沒有太多障礙。
一旦網(wǎng)站對(duì)我們?cè)L問(wèn)做些限制,比如驗(yàn)證碼;或者將數(shù)據(jù)進(jìn)行處理,比如設(shè)置編碼格式或加密,那么我們就需要將這些困難一個(gè)個(gè)克服來(lái)獲取最終的結(jié)果。
以上,便是一個(gè)完整抓取愛爾眼科網(wǎng)站上醫(yī)院數(shù)據(jù)的流程了,感受如何?
如果有朋友還不知道爬蟲、程序員每天都在干啥,也可以給他科普科普了~
最后,可能有人疑問(wèn):我閑著沒事,去下載這些醫(yī)院數(shù)據(jù)干嘛?
醫(yī)院數(shù)據(jù)的價(jià)值可能不好直接體現(xiàn),不妨把它換成一個(gè)個(gè)用戶數(shù)據(jù)……
