網頁爬蟲是指利用程式去自動獲取網頁資訊的技術,當你掌握了此技術之後,你就可以有源源不絕的資料進行各種應運。因此這是現今資料分析人員必定要掌握的技術。
一般使用者是以瀏覽器依據網址(url)向某一網站伺服器送出請求(request),如果對方伺服器同意你的請求,就會做出回應(response),將網頁的原始碼回傳給你的瀏覽器,瀏覽器再將原始碼轉換成圖文並茂的頁面。
而網路爬蟲即是以程式碼偽裝成一般的使用者,向對方伺服器送出請求,取得回應(原始碼)。再從原始碼中抽取出需要的資訊。
又稱為spider , spiderbot ,或直接簡稱crawler。一般是搜尋引擎進行網路索引時(web indexing)使用的技術。crawler會造成網站伺服器的負擔,或侵犯一些隱私資訊,因此網頁開發人員會在網站中添加robots.txt這個檔案或添加,用來告知crawler這個網站中哪些東西可以取得或不可取得。
首先拜訪數個網站,獲取這些網站內的所有超連結,一一拜訪這些連結,再獲取一大堆新的連結。再一一進入獲得的超連結,連出去,重複此動作。
大部分是大規模的拜訪不特定的網站。
ref: https://en.wikipedia.org/wiki/Web_crawler
又稱為web harvesting, web data extraction,和網頁爬蟲極為相似,通常指針對獲取特定網域底下的數個分頁的資料,並將其轉化程結構化的格式(如漂亮整齊的excel表)的過程。
除了連續獲得連結,連出去之外(如同crawler),還必須剖析(parse)各分頁的原始碼,將含有你需要的資料片段擷取下來。
可以是任何規模,通常是針對特定幾個網站。
一般中文稱呼的網路爬蟲,事實上指的是這一類(web scraper),而非web crawler。
ref: https://en.wikipedia.org/wiki/Web_scraping
這是我個人實做時所進行的流程,提供給你們參考
鎖定目標
需要哪些資料?目標網站是哪幾個?
觀察網站結構
觀察目標網站的伺服器是如何存取資料。在網頁原始碼里嗎?又或者是動態網站,以GET或POST來產生你所看到的資訊?將資訊藏在xml、json等檔案之中嗎?是否有提供api可以直接拿到資料呢?以此來決定要用哪種方式獲取網頁資訊。
嘗試爬取各網頁
試圖獲得html原始碼。 觀察一下, 是否會被對方伺服器判定成惡意程式擋掉呢?如何偽裝躲過判定?如何送get或post資料給目標網站呢?如何處理認證問題呢?
剖析網頁原始碼
是否能將html原始碼中,含有你所要的資訊的片段,抓取下來?
重複爬取
當可以成功獲得一個分頁的特定資訊後,就可開始利用迴圈大規模的重複拜訪撈資料。這個過程中很容易會遇到例外狀況將你的爬蟲程式阻隔。
打包資料,輸出
成功,現在可以將努力獲取來的資料拿去做你要做的事,恭喜你完成了一次精彩的網頁爬蟲!
爬取相關套件
urllib - python內建的基本套件,是我早期進行爬蟲使用的套件,該有的功能都相當齊全,但是由於requests的出世,現今大家似乎都以requests套件為起始,新手教學也完全不提urllib。
requests - 由於使用上較urllib更於簡單好上手,現今都是使用requests。
selenium - 自動化操縱瀏覽器的工具,使用之後你的瀏覽器會真的自己打開,開始做你指定給他的事情。原本主要是用來測試網頁,但是由於是真正的瀏覽器在運作,因此當你的要爬取的網站需要很麻煩的驗證時(如facebook),這一類的工具就成了你的最後救星。缺點是執行速度很慢。
剖析html相關套件
re - 使用正規表達式(regular expression)的套件,一套精確的文字搜尋規則,可以讓你精確的抓出符合特定模式的某段文字段落,有空一定要學,學會了你只會後悔為何當初不早點學。如果你想做任何文字探勘的工作,這是基本能力。
ref - https://zh.wikipedia.org/wiki/Regular_expression
教學資源:https://regexone.com/
beautifulsoup - 利用html語法的標記,搜尋你要的特定元素。使用上會比re方便許多,因此目前普遍都是教這個套件。
資料整理相關套件
pandas - 將資料把包成excel檔或類似格式輸出。
(這一區塊就是要接去做資料分析,依據你的需求整理成接下來跑資料分析要用的格式)
加速爬蟲相關套件
如果你需要爬很快很快的話,可以再外加使用:
multiprocessing - 多進程,開啟之後可以動用所有的CPU來進行爬蟲。(通常只會動用到1個CPU)
aiohttp- 異步,節省拜訪網站時,等待對方伺服器回應的時間。
這屬於較進階的操作,我會放到之後的教學再介紹。
完整合一的套件
scrapy - 由Scrapinghub公司以python編寫開發維護的開源爬蟲庫,據說是現在被認為最強大完整的工具,除了爬取外也將剖析資料都打包整合在一起,多線程,異步,等一併也都加進來。如果你打算靠爬蟲這套技術來吃飯的話,scrapy是你不能錯過工具。
重複連續的拜訪某一網站,會造成對方伺服器的負擔,所以,請不要太快。
以下整理幾點禮貌原則:
1 遵從robots.txt的規範
例如:https://www.awoo.com.tw 的robots.txt里提到,不限任何user agent,以及這一些分頁請不要爬等。
2 提供user agent,在其中加入你的個人訊息,如單位名稱或email等,讓對方的伺服器可以辨別你,如果爬的太過頭影響到對方伺服期運作時,他們可以跟你聯絡。
3 在連續的請求中加入延遲,減緩對方伺服器的負荷。
4 如果對方有提供資料下載區,或網頁api提供資料,請不要爬。
reference:
https://stackoverflow.com/questions/2022030/web-scraping-etiquette
https://blog.scrapinghub.com/2016/08/25/how-to-crawl-the-web-politely-with-scrapy
以上就是關於網路爬蟲的基本介紹,接下來就要開始教學囉!
實做上會碰到一大堆例外狀況,我會在實做教學的部份提出建議的處理辦法。
Are you ready?
Let's go~