適合本篇閱讀的人:
想概略了解爬蟲的人、想寫爬蟲的人
本篇架構:
- 什麼是爬蟲?為什麼要學爬蟲?
- 爬蟲是怎麼辦到的?
- 想要學爬蟲,我該怎麼做?
- 開始學爬蟲前的注意事項
- 後語
什麼是爬蟲?為什麼要學爬蟲?
網路爬蟲是可以自動化替你蒐集網頁上資訊的程式。
試著想想看,如果你需要各公司的財報資訊來做股市的研究,該怎麼做呢?打開瀏覽器,輸入「公開資訊觀測站」的網址,下條件篩選出想找的財報,在下載成CSV檔…,不,這只有一間公司,但上市上櫃公司好幾百間,加上不同年份、不同季,下載起來可是很費力的!換個生活化的例子,假如想在PTT上找租屋,一般來說,只能下關鍵字,然後一篇一篇的找,時間是很寶貴的,但如果有爬蟲能日復一日的幫你抓取每一篇的資訊,並幫你做過濾,再把你可能喜歡的租屋資訊推薦給你呢?
藉由以上的案例,我們知道爬蟲可以自動化收集資料,重複性高的事情只要寫一次程式,之後就交給程式幫你處理就行了!我們可以更專注在其他事情上,這麼好的東西,怎麼不學呢?各行各業的可以從中得到好處(笑)。
爬蟲是怎麼辦到的?
平常我們瀏覽網站,其實就是對遠方的伺服器提出一個請求(Request),這時候遠方伺服器就會收到資訊,並且回傳(Response)給你html, css, javascript等資訊,接著你的瀏覽器會把這些檔案組成你現在看到的網頁。
同樣的爬蟲原理就是,藉由你的爬蟲程式去進行Request,在跟你的程式說接收到Response後,該怎麼解析出你想要的資訊,最後再把他們存起來。
簡易的架構如下,以下以爬取論壇網站為例,凡事都要有個開始,我們需要有個初始URL,也有人稱作種子網址,好比論壇的首頁,接著解析論壇首頁,把每一篇文章都加入倒任務佇列當中,從中取出一篇解析,並寫入資料庫,若是需要在更深入一層,我們就會將這URL加入到柱列當中,等待下一次處理。
想要學爬蟲,我該怎麼做?
你得先選一個語言,目前主流是Java跟Python,在網路上能找的資源也比較豐富,我個人比較喜歡Python,以下就以Python為例,依我個人經驗,分為三個方案。
方案一:最直接的作法
Requests + 解析器(PyQuery或Beautifulsoup)
這是最簡單的做法,Requests是Python的一個套件,它可以建立HTTP請求,也就是上面提到的Request,接著我們收到的HTML在使用解析器去擷取出想要的資訊,比較常用的套件是PyQuery跟BeautifulSoup,這種方式好處在於你不用裝太多東西,若是符合以下條件,建議你可以選擇這個方案:
- 剛接觸爬蟲的人
- 需求不是太複雜(爬取的層數1~2層)
- 一次性的任務
方案二:使用爬蟲框架
有些網站對於資料的保護意識比較高,會對於爬蟲做一些防護,稱作為反爬蟲。這種網站可不是那麼好對付,框架通常都會幫你想到些解決方案,你可以用框架提供的函示或是參數的調整來輕鬆達成,就不用什麼都自己寫了,最常聽到的Scrapy跟Pyspider,兩者各有各的優缺點,有機會後續會在做文章來做介紹,簡單來說,Scrapy自訂程度較高,而Pyspider則是有監控介面、易維護的優勢。若是符合以下條件,建議你可以選擇這個方案:
- 需要短時間完成爬蟲程式
- 需要長時間維護(在框架下,多人合作跟後續維護都會比較方便,並在某種規範之下)
- 有特殊需求者(像我很喜歡Pyspider的監控介面)
方案三:使用Selenium
Selenium是瀏覽器自動化(automates browsers)的工具,他支援 Java、C#、Ruby、Python 多種語言,瀏覽器也可以選擇Chrome、FireFox等多個選擇,官方定位他在「網頁應用程式的自動化測試」,但就因為功能太強大,所以也被應用在爬蟲上,你可以想像你的爬蟲程式操作的瀏覽器,模仿使用者在瀏覽網頁,像是輸入帳號密碼,點擊按鈕…等。
這方案好處在於簡單暴力,若你遇到需要登入才能抓取的資料,你就模仿使用者登入方式,若你遇到滾輪下滑才能載入的資烙,你就模仿使用者滑滾輪,以上都有其他繞過去的方式,但就需要點經驗,相對的,Selenium程式語法很單純,更有小工具能紀錄你的操作,並且匯出程式碼,更加速開發的速度。當然也不是萬靈藥,也是存在著缺點,比如說,因為要模擬使用者的行為,導致速度慢,較適合規模小的爬蟲。若是符合以下條件,建議你可以選擇這個方案:
- 爬蟲規模不大
- 想要爬反爬蟲的網站,但又繞不過登入、找不到網站載入資料的方式
開始學爬蟲前的注意事項
換個角度思考,如果你是架設網站那方,遇到每秒就拜訪一次的機器人,那真的是很臉很綠,這可能會對伺服器造成延遲(因為拜訪網站的人變多了),嚴重一點就是伺服器癱瘓(人滿到動彈不得),所以呢,我們在撰寫爬蟲程式時,一定要設置停頓的時間,也盡量不要重複拜訪相同頁面。
後語
這是我的第一篇文章,希望不是最後一篇(笑),希望能把自己所知的知識整理整理,提供那些想了解的網友了解,之後確定會寫Pyspider的文章,也會寫些機器學習的文章,覺得寫不錯給我拍手一下,我會很開心的,以上。