[Python網頁爬蟲] Scrapy的安裝與使用入門-1
網頁爬蟲作業基本上會有幾個步驟,包括識別目標網址、取得網頁的內容,解析網頁以及儲存網頁的資料等步驟。上述的工作都可以利用Scrapy定義好的模組來完成,省去我們不少的時間。
Scrapy是一套開放原始碼框架,它已經定義了完整的爬蟲流程與模組,透過這個框架可以快速、簡單的幫助我們抓取HTML頁面、取得API回傳的資料,甚至於可以撰寫非同步網頁爬蟲。
以下將討論如何透過Scrapy的使用進行網站頁面的爬取。
Scrapy安裝
可以使用Anaconda安裝或者是使用PIP安裝Scrapy。
透過Anaconda安裝
Anaconda是一個適合資料科學分析的開源套件管理系統。裡面包含了Python環境,以及爬蟲、資料分析、資料視覺化、機器學習等相關套件。方便開發者進行分析使用。因此,我們也可以透過Anaconda來安裝Scrapy。
如果電腦上已經安裝Anaconda的話,可以先為專案建立一個虛擬環境。
建立虛擬環境
通常我們會在一台電腦中同時開發多個專案,專案與專案之間會因為需求的不同而安裝不同版本的套件,如果這些套件都混在一起,一旦發生執行上面的問題,就會牽一髮動全身、非常難以處理。比較好的管理方式,是將安裝的套件依照不同的專案分別出來,個別放在不一樣的虛擬環境中。
在Anaconda下也建立虛擬環境,你只需要透過操作Anaconda Navigator圖形介面來達成。
在Anaconda Navigator圖形介面的下方有一個Create按鈕(紅字1的位置),點下去就會跳出一個視窗。
在該視窗中Name的地方(紅字2的位置),填上虛擬環境的名稱並在下面選擇Python版本後,按下create按鈕就可以建立一個專案專屬的虛擬環境。
conda 安裝 Scrapy
先打開虛擬機的終端機,並在終端機介面下安裝Scrapy。
如題所示,在剛剛建立的虛擬機(my_scrapy_env)右邊有一個箭頭,點下該箭頭後會彈出一個視窗,在視窗中選擇第一個項目『Open Terminal』打開終端機介面。
進入終端機介面後,在終端機的命令列中輸入下面指令安裝scrapy:
conda install -c conda-forge scrapy
透過pip安裝
使用pip安裝,但是比較複雜。尤其在Windows上面安裝。如果是在Mac或Linux上面,則比較容易:
$ pip install Scrapy
初探Scrapy指令
安裝完scrapy後,我們可以打開終端機確認一下是否安裝成功。首先,打開打開終端機介面,如果看到提示訊息前面出現虛擬機的名稱,就表示以下的操作都在這個虛擬環境下執行。在這裡虛擬機的名稱是my_scrapy_env,畫面上也有 (my_scrapy_env)的字樣,表示目前所在位置正確。
接著先輸入Scrapy指令,輸入後會顯示下面訊息:可以看到版本號以及一些指令(Available commands)。
Available commands例如:
- bench:可以進行測試
- fetch:可抓取一個指定的網址
- genspider:可以透過預先定義好的模板初始化一個爬蟲程式。
使用Scrapy Shell
與Python一樣,Scrapy也提供Shell的交談介面。讓我們在建立正式的爬蟲程式碼前,可以透過這個介面進行測試。
Scrapy Shell的進入與退出
在終端機視窗裡面,輸入下面的指令可以啟動並進入Scrapy Shell。
$ scrapy shell
進入Scrapy Shell後,可以看到提示符號(下圖紅色框框處),我們可以在提示符號後面輸入程式碼來測試看看。
前面提到 fetch 指令可以用來抓取一個指定的網址,我們可以在此測試看看透過該指令抓取google網站的首頁。
In [2] fetch('http://google.com')
執行結果如下:
使用view函式可以顯示下載的內容:
In [3] view(response)
如果想要將下載的原始碼顯示出來,可以使用 response.text
。
In [4] print(response.text)
Scrapy 選擇器同時支援CSS選擇器與XPath表達式。因此我們可以使用任一種方式來擷取HTML上面的DOM元素。在CSS選擇器時,使用的是 response.css()
而在 XPath 表達式時則是使用 response.xpath()
。
例如在Apple網站上,只要Scrapy Shell裡面輸入下面兩行指令可以透過XPath表達式選定畫面中的圖片(如下圖紅色區):
fetch('https://www.apple.com/tw/')
response.xpath("//main/section[1]/div/picture/img").extract()
如果不使用XPath表達式,而要透過CSS選擇器的話,就需要輸入下面的兩行指令:
fetch('https://www.apple.com/tw/')
response.css("#overview-hero-hero-1 > img").extract()
實際上,顯示出來的結果是一樣的:
若在Scrapy Shell的提示符號後面輸入quit指令,可以退出Scrapy Shell。
In [2] quit
如下圖紅色框框處:
建立Scrapy爬蟲專案(startproject)
當我們建立 scrapy 爬蟲專案時,仍要在終端機裡面操作,並且需用到 startproject
這個指令。
$ scrapy startproject 專案名稱
使用 startproject
指令可以建立一個 scrapy 爬蟲專案。舉例來說,當我們要建立一個名稱為 my_spider_1 的scrapy 專案時,使用的指令如下:
$ scrapy startproject my_spider_1
輸入上面的指令,並按下enter鍵後,畫面上會出現類似下面的樣子:
此時,你會發現下面幾段提示文字:
You can start your first spider with:
cd my_spider_1
scrapy genspider example example.com
根據這段文字的提示,我們可以使用 cd 指令,進入專案的資料夾裡面。
Scrapy的檔案結構
Scrapy 建立專案後,會自動產生一個 <project-name>
目錄,而這裡的 <project-name>
是 my_spider_1
。打開資料夾,我們可以看到下面的檔案結構。如下圖所列出的檔案,這是 Scrapy 的 startproject
指令所產生的初始化檔案。
其中有幾個檔案必須說明的:
scrapy.cfg檔案
這個檔案為部屬scrapy的設定檔,它會幫助我們執行scrapy指令。
my_spider_1資料夾
在這個資料夾之下的檔案為爬蟲模組,其中:
- pipelines.py 檔案定義資料萃取的流程,用於抓取數據後的處理。可以自行撰寫程式碼來客製化資料的處理方式。
- settings.py 檔案是爬蟲專案的設定檔,可以設定各種選項。例如爬蟲的延遲時間、輸出方式等等。
- items.py 檔案提供抓取資料項目的結構定義,用來決定要爬取網頁的哪些項目。
spiders資料夾
這個資料夾位於my_spider_1資料夾底下,是爬蟲程式目錄。
它可以說是爬蟲之主體,用來定義如何抓取需要的數據。當我們執行爬蟲程式指令時,就是在搜尋這個資料夾裡面對應的檔案。
建立爬蟲(genspider)
前面透過 cd 指令切換到 my_spider_1
專案目錄後,就可以使用 genspider
指令建立新的爬蟲。
scrapy genspider <名稱> <網站>
genspider 後面接的第一個是爬蟲的名稱,第二個是爬取的網站網址。
目標網站
在這裡我們要抓取的目標頁面是 https://www.advertimes.com/global/:
因此在建立爬蟲時需要輸入下面的指令。
$ scrapy genspider advertimes www.advertimes.com
其中scrapy genspider
後面第一個是爬蟲名稱( advertimes
),建議在命名爬蟲名稱時不要包含 -
或_
等符號;第二個是目標網站( www.advertimes.com
),要注意的是在這裡不需要輸入 https://
。
執行後,在spiders資料夾裡面就多出一個advertimes.py的檔案。
爬蟲檔案的內容
scrapy已經幫我們建立了一個爬蟲樣本。若打開 advertimes.py
檔案,可以看到檔案的內容為:
import scrapyclass AdvertimesSpider(scrapy.Spider):
name = 'advertimes'
allowed_domains = ['www.advertimes.com']
start_urls = ['http://www.advertimes.com/'] def parse(self, response):
pass
整支程式裡面匯入了Scrapy(import scrapy
)並且有一個類別( class AdvertimesSpider(scrapy.Spider)
),這個類別基本上繼承了 scrapy.Spider 類別。有關Python物件導向與繼承可以參考下面這一篇:
類別中的屬性與方法如下:
- name:為爬蟲的名稱,是每支爬蟲在專案中的唯一名稱。在這裡的名稱為 advertimes(
name = 'advertimes'
) - allowed_domains :用來定義允許這支爬蟲獲取資料的網域清單,爬蟲只會爬取這個domain下的頁面。在這裡為www.advertimes.com(
allowed_domains = ['www.advertimes.com']
)。 - start_urls:為爬蟲啟動開始爬取的第一個頁面的網址。在這裡幫我們產生的為http://www.advertimes.com/(
start_urls = ['http://www.advertimes.com/']
),但由於我們要爬取的目標頁面為https://www.advertimes.com/global/,可以手動修改這裡的值。 - parse函式:這個函式將會執行爬取的作業,是實際爬取資料的Python程式碼。我們需要把程式寫在這個函式裡面。
爬蟲的執行方式
爬蟲程式寫好後,需要透過 Scrapy 的 crawl 指令來執行爬蟲。crawl 的後面要接續的是爬蟲的名稱。執行這個指令時,Scrapy會搜尋專案中spiders資料夾裡面相對應的檔案。
$ scrapy crawl <名稱>
以這裡來說我們要執行下面的指令:
$ scrapy crawl advertimes
以上是Scrapy爬蟲框架大致上的基本使用方式,接下來就可以透過這些方式實際爬取目標網頁。爬取網頁的細節我們留待下一篇說明。