Python爬蟲基礎講解(二十七):scrapy 框架—ltem和scrapy.Request
Python爬蟲、資料分析、網站開發等案例教程視訊免費線上觀看
https://space.bilibili.com/523606542
Python學習交流群:1039649593
ltem
Item是儲存爬取資料的容器,它的使用方法和字典類似。不過,相比字典,Item提供了額外的保護機制,可以避免拼寫錯誤或者定義欄位錯誤。
建立Item需要繼承scrapy.Item類,並且定義型別為scrapy.Field的欄位。在建立專案開始的時候Item檔案是這樣的。
import scrapy class Tutorial1tem(scrapy.Item): #define the fields for your item here 7ike:#參照下面這個引數定義你的欄位#name = scrapy.Fie1d() pass
在儲存資料的時候可以每次初始化一個字典等格式,但是最方便,最好的儲存方式就是使用Scrapy自帶的ltem資料結構了。
我們學習了從頁面中提取資料的方法,接下來學習如何封裝爬取到的資料。應該用怎樣的資料結構來維護這些零散的資訊欄位呢?最容易想到是使用Python字典(dict)。
回顧之前的程式碼
class Quotesspider(scrapy.spider): name = 'quotes' a1lowed_domains = ['toscrape.com'] start_ur1s = ['http: //quotes.toscrape.com/'] def parse(self,response): quotes = response.css( '.quote ' ) for quote in quotes : text = quote.css('.text: :text ').get() author = quote.css( '.author : :text ').get() tags = quote.css( '.tag : :text ' ).getall() yield { 'text':text,'author':author, 'tags ' : tags, }
在該案例中,我們便使用了Python字典儲存一本書的資訊,但字典可能有以下缺點:
(1)無法一目瞭然地瞭解資料中包含哪些欄位,影響程式碼可讀性。
(2缺乏對欄位名字的檢測,容易因程式設計師的筆誤而出錯。
(3)不便於攜帶元資料(傳遞給其他元件的資訊)。
ltem和Field
Scrapy提供了以下兩個類,使用者可以使用它們自定義資料類(如書籍資訊),封裝爬取到的資料:
1. ltem基類
資料結構的基類,在items.py中定義資料結構時,需要繼承自該基類。
2. Field類
用來描述自定義資料類包含哪些欄位(如name、price等)。
自定義一個數據類,只需繼承ltem,並建立一系列Field物件的類屬性即可。
以定義書籍資訊quote為例,它包含個欄位,分別為書的名字text、author和tags,程式碼如下:
#特殊的字典結構可以在scrapy中傳遞資料 class TutorialItem(scrapy.Item): #Field欄位 #就是類似於產生一個類似字典格式的資料擁有字典的一些屬性 #欄位預設為空 #我們可以通過例項化像著鍵賦值但是如果沒有寫這個鍵就不能賦值但是字典可以 text = scrapy. Field() author = scrapy.Fie1d() tags = scrapy . Fie1d()
ltem支援字典介面,因此Tutorialltem在使用上和Python字典類似。
對欄位進行賦值時,Tutorialltem內部會對欄位名進行檢測,如果賦值一個沒有定義的欄位,就會丟擲異常(防止因使用者粗心而導致錯誤)
scrapy.Request
Request和Response 物件,用於爬網網站。
Request物件用來描述一個HTTP請求,下面是其構造器方法的引數列表:
Request(url,ca11back=None,method='GET', headers=None,body=None, cookies=None,meta=None,encoding='utf-8 ',priority=O, dont_filter=False,errback=None,flags=None,cb_kwargs=None)
-
url(字串) -此請求的URL
-
callback (callable)-將以請求的響應(一旦下載)作為第一個引數呼叫的函式。有關更多資訊,請參見下面的將其他資料傳遞給回撥函式。如果"請求'未指定回撥,parse()則將使用"Spider"方法。請注意,如果在處理過程中引發異常,則會呼叫errback.
-
method(字串)-此請求的HTTP方法。預設為‘GET'。
-
meta (dict) - Request.meta屬性的初始值。如果給出,則在此引數中傳遞的字典將被淺表複製。
-
headers (dict)-請求頭。dict值可以是字串(對於單值標頭)或列表(對於多值標頭)。如果None作為值傳遞,則將根本不傳送HTTP標頭。
c1ass Quotesspider(scrapy.spider): name = 'quotes_3' allowed_domains = ['toscrape.com'] start__ur1s = ['http://quotes.toscrape.com/'] def parse(self,response): quotes = response.css( '.quote ' ) for quote in quotes: text = quote.css( '.text: :text ' ).get() author = quote.css( '.author : :text ' ).get() tags = quote.css( '.tag : :text ' ). geta11() yield Qd01QuotesItem(text=text,author=author,tags=tags) next_page = response.css( '.next a: :attr(href) ' ).get() if next_page: next__ur1 = 'http: //quotes.toscrape.com' + next_page yield scrapy. Request(next_url, cal7back=self.parse)