[Python網頁爬蟲] Scrapy的安裝與使用入門-1

Sean Yeh
Python Everywhere -from Beginner to Advanced
11 min readJun 10, 2022
Lake Tekapo, New Zealand ,photo by Sean Yeh

網頁爬蟲作業基本上會有幾個步驟,包括識別目標網址、取得網頁的內容,解析網頁以及儲存網頁的資料等步驟。上述的工作都可以利用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 顯示出來的結果

若在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

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。