Python Scrapy Shell教程

語言: CN / TW / HK

Python Scrapy Shell Tutorial

當你用Python Scrapy進行搜刮時,從網站上獲取和選擇資料可能是很乏味的。有大量的更新程式碼,執行它,並檢查你是否得到了你期望的結果。Scrapy提供了一種方法來使這個過程更容易,它被稱為Scrapy Shell。Scrapy shell可以從終端啟動,這樣你就可以測試所有你想在Scrapy專案中使用的各種XPath或CSS選擇器。它真的很整潔,所以現在讓我們來看看它。


啟動Scrapy Shell

python $


用一個URL開啟Scrapy Shell

我們的目標是在Scrapy shell中使用一個頁面的內容進行測試。Scrapy給了你一個快捷方式來啟動外殼,同時獲取一個URL。

scrapy_testing $

現在你可以在Scrapy shell中馬上看到請求和響應。Scrapy向https://scrapethissite.com/pages/發出了一個GET請求,請求是成功的,我們可以看到200 OK響應。

[s] Available Scrapy objects: [s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc) [s] crawler <scrapy.crawler.Crawler object at 0x0000015474761190> [s] item {} [s]


練習XPath

現在是有趣的部分。我們有一個記憶體中的頁面源,我們可以很容易地使用XPath來查詢文件中的各種元素和內容。讓我們先來看看有關頁面的導航。導航的原始碼在這裡。

```markup

```

上面的程式碼片斷只是源頁面上整個HTML標記的一小部分。選擇頁面上的資料和內容可以是廣泛的,也可以是集中的,只要你喜歡。


查詢響應

我們可以像這樣使用XPath來獲取上面的整個程式碼片段。

In [12]:

上面的程式碼就是所謂的查詢響應。當在響應上呼叫.xpath()或.css()方法時,當單個元素被匹配時,你得到的是一個選擇器物件,當多個元素被匹配時,得到的是一個選擇器物件列表。

單個選擇器物件

In [9]:

選擇器物件的列表

In [7]:


選擇器方法

一旦你有了一個選擇器物件,你可以使用各種方法從選擇器中提取資料。你會使用像.get().getall().re_first().re()等方法。你還可以使用.attrib屬性來讀取源中包含的屬性值。


.get() vs .getall()

這是選擇器物件上最常用的兩個方法。.get()方法提取第一個選擇器物件的內容,即使從.xpath()或.css()查詢返回的物件不止一個。舉個例子,我們知道xpath()查詢的'//li/a'實際上返回了幾個選擇器物件。注意在這種情況下.get()和.getall()的區別。

.get()

In [14]:

.getall()

In [15]:

.re()

.re()方法可用於使用正則表示式來提取資料。

In [18]:

.re_first()

.re_first()方法與.re()的作用相同,只是它只返回第一個正則表示式的匹配。

In [19]:


選擇特定元素

在.css()查詢、.xpath()查詢以及.get()和.getall()的各種組合之間,你可以在任何時候獲得你喜歡的頁面的任何部分。下面是一個使用XPath獲取每個單獨連結的例子。

In [2]:response.xpath('//li[1]/a')
Out[2]:[<Selector xpath='//li[1]/a' data='n ...'>]

In [4]:response.xpath('//li[3]/a')
Out[4]:[]

In [5]:response.xpath('//li[4]/a')
Out[5]:[]

這是同一件事,但使用列表索引來獲得所需的元素,而不是XPath本身。

In [11]:


用text()刪除HTML標記

在網路搜刮過程中,你感興趣的並不是標記,而是標記標籤中的內容。在構建XPath查詢時,你可以使用XPath中的text()節點指定器。DOM中的所有專案都是一個節點,甚至是文字。要指定一個文字節點,你可以使用text()。讓我們看看一些例子。

In [11]:

In [12]:

In [13]:

處理空白處和換行符

很多時候,網頁上的標記並不漂亮。它的渲染效果很好,因為瀏覽器抽象出了任何空白或換行字元,但當你在網路上搜刮時,這些不規則的標記就會被發現。例如,請看這個標記。

html with whitespace and newlines

在XPath查詢過程中,所有這些空白和換行符都會出現。

In [18]:

如果你願意,你可以新增Python strip()方法來克服這個問題。

In [19]:

在外殼中的迴圈

即使在Scrapy shell中,你也可以在響應資料上迴圈。

In [25]:


改變工作響應

你可以通過簡單地使用fetch()方法獲取一個新的頁面來改變你在Scrapy shell中測試的頁面。讓我們把我們要查詢的響應改成別的東西。

In [3]:

現在我們可以用XPath查詢所有段落的頁面元素。

In [8]:


Python Scrapy Shell教程總結

Scrapy shell是一個有趣的測試環境,在這裡你可以很快地嘗試和除錯你的搜刮程式碼,而不需要執行蜘蛛。它的目的是測試資料提取程式碼,但你也可以用它來測試任何種類的Python程式碼,因為它可以作為一個標準的Python shell。

Scrapy shell非常適合測試你的XPath或CSS表示式,看看它們是如何工作的,以及它們從你試圖搜刮的網頁中提取了哪些資料。它是在你編寫蜘蛛程式時互動式地測試你的表示式的一個好方法,而不必執行蜘蛛程式來測試每一個變化。

經過一段時間的練習,你會發現Scrapy shell是開發和除錯蜘蛛程式的絕佳工具。