關於Python 的Scrapy簡介

語言: CN / TW / HK

Python Scrapy Introduction

Python Scrapy庫是一個非常流行的網路刮削軟體包。網路刮削是使用該軟體以程式設計方式從線上網頁中提取關鍵資料的過程。使用這種技術,可以從單個頁面中刮取資料,也可以在多個頁面中爬行,邊爬邊刮取每個頁面的資料。這第二種方法被稱為網路爬行,當軟體機器人跟隨連結找到新的資料進行抓取。Scrapy使得以自動化方式設定這些網路機器人爬蟲成為可能,我們現在將學習如何開始使用Scrapy。


安裝Scrapy

安裝Scrapy非常簡單,可以在終端完成。

pip install Scrapy

一旦完成,你可以通過使用這個命令檢視幫助選單來檢查安裝情況。

``` scrapy $scrapy --help Scrapy 2.4.1 - no active project

Usage: scrapy [options] [args]

Available commands: bench Run quick benchmark test commands fetch Fetch a URL using the Scrapy downloader genspider Generate new spider using pre-defined templates runspider Run a self-contained spider (without creating a project) settings Get settings values shell Interactive scraping console startproject Create new project version Print Scrapy version view Open URL in browser, as seen by Scrapy

[ more ] More commands available when run from project directory

Use "scrapy -h" to see more info about a command ```

注意這個shell命令。


啟動Scrapy專案

Scrapy是一個功能豐富的框架,因此,你開始專案的方式與你在Django中的方式類似。下面的命令指示Scrapy建立一個名為scrapy_testing的專案。

scrapy $scrapy startproject scrapy_testing

``` New Scrapy project 'scrapy_testing' created in: C:\python\scrapy\scrapy_testing

cd scrapy_testing
scrapy genspider example example.com

```

PyCharm中的Scrapy

在Scrapy生成了存放[Scrapy專案]的資料夾和檔案後,我們可以在PyCharm或Visual Studio Code這樣的優秀IDE中開啟它。
scrapy startproject


Scrapy專案檔案

一個新的Scrapy專案會為你建立一個包含所有需要的檔案的腳手架。這些檔案在這裡列出,並有相關的連結指向有用的文件。

  • spiders持有你建立的Spider類,它定義了某個網站(或一組網站)如何被抓取,包括如何執行抓取(即跟隨連結)以及如何從其頁面中提取結構化資料
  • [items.py]在這裡為你的搜刮專案定義模型。定義了我們要抓取的物件或實體。Scrapy Items的宣告與類似,只是Scrapy Items要簡單得多,因為沒有不同欄位型別的概念。
  • [middlewares.py]在這裡為你的蜘蛛中介軟體,或Scapy鉤子定義模型。當向一個網站傳送請求時,請求可以被即時更新或修改,對響應也是如此。例如,如果你想給所有的請求新增一個代理,你可以在中介軟體中這樣做。
  • [pipelines.py]在這裡定義你的專案管道,定義了建立和過濾專案的函式。管道是用來清理HTML資料,驗證搜刮的資料,檢查重複的資料(並刪除它們),如果需要的話,將搜刮的專案儲存在資料庫中。
  • [settings.py]專案設定,為了簡單起見,這個檔案只包含被認為重要或常用的設定。在設定檔案中,你可以配置機器人的名稱。BOT_NAME變數將在你建立Scrapy專案時自動設定為專案名稱。如果你願意,還可以在這裡設定一個自定義的USER_AGENT。
  • scrapy.cfg儲存配置資訊

蜘蛛

一個Scrapy專案可以被認為是一個蜘蛛的集合。這裡我們可以在Scrapy專案中建立一個新的網路蜘蛛。下面的命令指示Scrapy建立一個新的測試蜘蛛,從scrapethissite.com抓取資料。

cd scrapy_testing/spiders

spiders $scrapy genspider testing scrapethissite.com

Created spider 'testing' using template 'basic' in module: scrapy_testing.spiders.testing

spiders/testing.py
當你執行genspider命令時,預設的模板程式碼會為你建立。我們可以看到,生成的類使用[Python繼承法]來繼承蜘蛛類的所有功能。你可以手動建立一個Scrapy蜘蛛類,但如果你使用genspider命令,會快得多,而且不容易出錯。

```python import scrapy

class TestingSpider(scrapy.Spider): name = 'testing' allowed_domains = ['scrapethissite.com'] start_urls = ['http://scrapethissite.com/']

def parse(self, response):
    pass

```

parse()函式通過Scrapy傳遞給我們一個響應物件,我們想在其中填入一些東西,以返回一個包含從我們網站刮取的資料的物件。換句話說,響應變數包含了請求的整個源標記和URL的內容。正是在這個parse()方法中,我們需要定義程式碼,將響應內容縮小到我們真正感興趣的資料。下面是關於Spider的一些額外細節。

  • scrapy.Spider所有Scrapy蜘蛛的基類。你建立的蜘蛛必須繼承自這個類。
  • name這個字串設定蜘蛛的名稱。Scrapy用它來例項化一個新的蜘蛛,所以它需要是唯一的。
  • allowed_domains這是一個可選的允許蜘蛛抓取的域的列表。
  • start_urls這是蜘蛛開始抓取的地方。

XPath或CSS

在我們開始填寫parse()方法之前,我們需要看一下關於XPath和CSS選擇器的一些細節。在Scrapy中,你可以使用[XPath]或CSS選擇器從源網頁中提取資料。[CSS選擇器]往往在前端開發者中非常流行,而XPath則經常被那些喜歡正則表示式的人使用。兩者都是選擇所需資料的完全有效的方法,儘管XPath被稱為更強大一些,所以這就是我們現在要看的。


刮取一個頁面

我們要抓取的頁面位於https://scrapethissite.com/pages/,看起來像這樣。
!

為了成功地抓取這個頁面,我們需要更新start_urls變數和我們蜘蛛類中的parse()函式。請注意,我們在下面使用的XPath表示式只是說:"找到第一個類別為'page-title'的h3標籤,然後看一下子錨標籤的文字內容"。在XPath表示式的末尾,我們附加了Scrapy.get()方法來獲取第一個結果。

```python import scrapy

class TestingSpider(scrapy.Spider): name = 'testing' allowed_domains = ['scrapethissite.com'] start_urls = ['https://scrapethissite.com/pages/']

def parse(self, response):
    title = response.xpath('//h3[@class="page-title"]/a/text()').get()
    return {'title': title}

```

執行你的蜘蛛

為了執行你的蜘蛛,Scrapy提供了runspider命令,你可以像這樣使用。

spiders $scrapy runspider testing.py

輸出是相當冗長的,但如果你檢查它,你會發現你想搜刮的資料。它成功了!

{'title': 'Countries of the World: A Simple Example'}


crawl 命令

另一種你可以執行你的蜘蛛的方式可能會更乾淨一些,那就是使用crawl命令。

scrapy crawl testing


Python Scrapy介紹摘要

就這樣,對強大的Python Scrapy庫進行了很好的介紹。我們學習瞭如何使用Scrapy來定義一個新的專案,建立一個新的網路蜘蛛,並從一個網頁上獲取一些資料。