python網路爬蟲簡介

星期一 21 Jan 2019   even  

什麼是網頁爬蟲

網頁爬蟲是指利用程式去自動獲取網頁資訊的技術,當你掌握了此技術之後,你就可以有源源不絕的資料進行各種應運。因此這是現今資料分析人員必定要掌握的技術。

一般使用者是以瀏覽器依據網址(url)向某一網站伺服器送出請求(request),如果對方伺服器同意你的請求,就會做出回應(response),將網頁的原始碼回傳給你的瀏覽器,瀏覽器再將原始碼轉換成圖文並茂的頁面。

而網路爬蟲即是以程式碼偽裝成一般的使用者,向對方伺服器送出請求,取得回應(原始碼)。再從原始碼中抽取出需要的資訊。

相較於人工操作的,是將需要一頁頁的將某資訊複製貼上到你的資料集中,網路爬蟲在拜訪網站時是以程式碼進行,因此可以重複的 、自動的一再拜訪,這樣可以為你的人生省下許多寶貴的時光。

應用的情況如下:

  1. 每天自動下載蘋果日報 所有當日的文章標題
  2. 蛛式會社 或其他臉書社團中的蜘蛛照片下載下來。
  3. 蝦皮購物搜尋 "PS4" 得到的所有商品名稱與價格。
  4. 自動抓取股票資料、球賽資料、賽馬資料等等。
  5. 族繁不及備載...

中文上大家習慣以"網路爬蟲"統稱,但事實上,是包含了這兩個分類:網路爬蟲web crawler以及網頁抓取web scraper。

網路爬蟲 web crawler

又稱為spider , spiderbot ,或直接簡稱crawler。一般是搜尋引擎進行網路索引時(web indexing)使用的技術。crawler會造成網站伺服器的負擔,或侵犯一些隱私資訊,因此網頁開發人員會在網站中添加robots.txt這個檔案或添加,用來告知crawler這個網站中哪些東西可以取得或不可取得。

首先拜訪數個網站,獲取這些網站內的所有超連結,一一拜訪這些連結,再獲取一大堆新的連結。再一一進入獲得的超連結,連出去,重複此動作。

大部分是大規模的拜訪不特定的網站。

ref: https://en.wikipedia.org/wiki/Web_crawler

網頁抓取 web scraper

又稱為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原始碼中,含有你所要的資訊的片段,抓取下來?

重複爬取

當可以成功獲得一個分頁的特定資訊後,就可開始利用迴圈大規模的重複拜訪撈資料。這個過程中很容易會遇到例外狀況將你的爬蟲程式阻隔。

打包資料,輸出

成功,現在可以將努力獲取來的資料拿去做你要做的事,恭喜你完成了一次精彩的網頁爬蟲!

能力需求

  1. python (或其他語言) 基本操作能力,須大量使用控制迴圈處理例外狀況
  2. html基礎架構
  3. 正規表達式

Python相關套件

爬取相關套件

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~

python 網頁爬蟲教學
python網路爬蟲簡介
python網路爬蟲基本工具(1)
python網路爬蟲教學-實戰篇(1) 蘋果日報馬網
使用偽裝user-agent爬取蝦皮購物網
撈取深網中的資料-蝦皮購物API
以POST方式抓取資料-政府電子採購網
python網路爬蟲教學-Selenium基本操作
python網路爬蟲應用-facebook社團成員參與度分析

相關文章:

>