2015年9月25日 星期五

Python Crawler(網路爬蟲) 概念介紹以及環境建置

今天來介紹Crawler(網路爬蟲)是什麼?  它是個方便我們蒐集網路資源的技術...

至於起源並不是本篇的重點,就不詳談了  有興趣的話請看參考資料1


在進入主題前 先來介紹一些基本環境

電腦環境

作業系統:Windows7 

程式語言:Python 2.7

瀏覽器:Google Chrome


了解之後 廢話不多說 馬上進入正題

網路爬蟲運作的基本原理

模擬用戶使用瀏覽器輸入網址並透過HTTP協定中的GET方法送出一個請求(Request)到遠端的伺服器(Server),伺服器接受請求後,就會回應(Response)並回傳網頁內容(原始碼)的檔案回來,再經由瀏覽器轉譯後變成漂亮的網頁。


(Crawler運作原理)


對於Crawler而言,它看到並不是漂亮的畫面而是網頁原始碼,那麼我們要如何知道網站是用什麼方法送出請求 


Chrome瀏覽Google網站為例


1.在網頁上按F12 叫出開發者人員工具

2.在上面的頁籤看到Network

3.按F5重新整理頁面

4.看到結果 請求是用GET方法送出


(開發者人員工具觀測結果)



原理明白之後 就開始進入實作的階段,即用Python實際地寫出一個簡單的Crawler 

驗證理論是否正確 這樣才有感覺的...




安裝Python及相關套件在Windows上


一開始先安裝Python程式語言(廢話),就點下一步下一步就裝完了... (輕鬆帶過)


值得注意的地方是版本是用2.7.x 而不是3.x


為什麼? 根據大家在網路上的討論 我整理之後有兩個主要原因:

  1. 目前大部分的套件(Package),2.7.x在支援上較為完整,線上的教學文章也是最豐富的,反之3.x支援的Package少,支援度差且安裝上容易發生錯誤即不相容,教學文章自然就少。
  2. 依照學習趨勢來看,3.x會成為主流而2.7.x會逐漸被淘汰,目前2.7.x改版只是修正一些bug,將來就會停止更新,全力推廣3.x,其中較明顯的原因之一是2.7.x令人詬病的bug 在3.x得到改善,例如:2.7.x是用ASCII解讀程式碼,而3.xUTF-8,如果是預設以外的編碼就必須在第一行放置編碼聲明(encoding declaration),想了解編碼的細節請看參考資料4
結論:初學者的話建議學2.7.x 先把語言的特性摸熟有了基礎後,再跳3.x會較好且不會摔的太嚴重,那一開始就有其他程式語言經驗的人 就建議直接用3.x了。

套件來源

Python本身有著許多的套件可以使用,那這些套件都放在哪裡? 想當然是在網路上的某個網頁啦(廢話) 

Python官方有建立專門收集套件的網站,叫作PyPI(Python Package Index),想要找什麼套件

基本上都是從這裡開始尋找的。

(PyPI官方網站)


套件管理程式

這麼多套件,我要怎麼安裝並拿來運用或是哪天這個套件不符合需求,又要怎麼移除? 
在做程式開發時遇到這些問題要如何處理? 這時候管理套件這件事就顯得特別重要

管理套件程式簡單的講,就像是Windows控制台的新增移除工具一樣,有安裝、移除等功能。

以下就來介紹 easy_install  以及 pip 這兩個Python的管理套件程式怎麼用?

原本Python2.7.9版中沒有內建安裝 easy_install 和 pip
而這次的更新(2.7.10)就有內建,所以就不必再像之前一樣做繁雜的安裝動作,可以直接使用了(灑花),想知道詳細的指令和原由請看參考資料5。這裡就不詳述了。

以下是列出自己常用的指令:

easy_install



        1.安裝套件:
                easy_install  [套件名稱]

        2.移除套件:
                 easy_install -m [套件名稱]

        3.升級套件:
                 easy_install -U [套件名稱]

        4.列出使用範例: 
                 easy_install --help

pip

        1.安裝套件:
                 pip [套件名稱]

        2.移除套件:
                 pip uninstall [套件名稱] 
        
        3.列出所有已安裝的套件:
                 pip list
   
        4.升級套件:
                 pip install -U [套件名稱]
   
        5.列出使用範例
                 pip --help


這兩個都是管理套件程式那有什麼差別?

以下列舉自己用到現在的感想,細節請看參考資料6

1.pip能夠下載並自動安裝套件,easy_install只是下載下來,但是要手動下指令安裝套件。

2.pip的許多指令能夠自動化並且簡化許多功能,easy_install反之。

結論: 建議使用者在管理套件時,以 pip 為主,easy_install 為輔,因為 pip 仍持續開發中,有時候會發現某些套件無法使用 pip 安裝,但是卻可以用 easy_install 安裝。

如果使用 pip 及 easy_install 都無法安裝成功時。使用者不妨直接進入套件目錄,看該套件是否有提供 setup.py 檔案。按住Shift鍵點選滑鼠右鍵看到在此處開啟命令視窗,在命令列模式下輸入下列指令:

        python setup.py install

Python套件



這次的爬蟲需要用到三個套件 分別介紹一下:

Requests : 解析網路資源(URL)的套件。


Beautiful Soup4 : 解析HTML元素的套件。




lxml : 處理XML及HTML的編譯器套件



 下指令安裝套件
pip install lxml


pip install requests BeautifulSoup4


(安裝套件成功畫面)

驗證套件是否安裝成功,進入Python主控台輸入


import requests
from bs4 import BeautifulSoup


沒有錯誤訊息就代表安裝成功

                                    (驗證套件安裝成功畫面)


以上的內容都了解了 ,接著就可以嘗試撰寫一隻簡單的爬蟲


撰寫爬蟲

網站:某個知名的新聞網站(怕造成困擾不公佈)

用GET方法取得網頁


那GET方法是什麼?

廣義的來講就是HTTP協定的一種方法,不過這樣講沒人聽得懂甚至無感。

簡單的說明就像是明信片一樣,將內容寫在上面送出,那GET的方法也是一樣,將要送的內容寫在網址列上送出。想知道更清楚請看參考資料7

這裡將用前面章節提到的Requests套件實現GET方法並取得整個網頁的內容

Step1:
確認該網站是用什麼方法發出請求到遠端的伺服器,這部分可以用Chrome開發者人員工具來得知。

Step2:
知道網站是用什麼方法之後,撰寫程式碼取得網頁內容
以下為程式碼




如果我只要網頁裡的特定資訊 如:新聞標題、內文,而不是要整個網頁內容 要怎麼寫?

這時要使用Beautiful Soup4來解析網頁的DOM結構
透過指定特定的元素就可以取得我們要的新聞資訊,如果不知道DOM請看參考資料8 這裡就不介紹了...


開始實作



Step1:
用Chrome開發者人員工具確認該網站是用什麼方法

Step2:
撰寫程式碼取得特定的元素,以下為程式碼




最後來介紹可以幫助你提升撰寫爬蟲效率的好工具

1.Postman – REST Client:測試API的Chrome Extension。

細節請看參考資料3




2.Cmder:Windows平台最好用的cmd 

解決中文字重疊的問題

開啟 Cmder 的 Setting 視窗,取消勾選 Main console font 下的 Monospace。



3.InfoLite:用滑鼠標示出網頁的元素

使用教學:
https://www.youtube.com/watch?v=_zv0IXEQxMA




4.Jupyter:一個網頁介面的文字編輯器,並能夠在上面撰寫程式碼、建立檔案以及執行檔案



安裝教學:https://www.youtube.com/watch?v=xWICyTVSIQs


進階操作:https://www.youtube.com/watch?v=lWkcP4xF8wI



下節將介紹在不同情況下爬蟲如何收集資料的概念及應用...


參考資料


4 則留言: