Python中scrapy框架的ltem和scrapy.Request詳解
Item
Item是保存爬取數據的容器,它的使用方法和字典類似。不過,相比字典,Item提供了額外的保護機制,可以避免拼寫錯誤或者定義字段錯誤。
創(chuàng)建Item需要繼承scrapy.Item類,并且定義類型為scrapy.Field的字段。在創(chuàng)建項目開始的時候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等)。
自定義一個數據類,只需繼承l(wèi)tem,并創(chuàng)建一系列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"方法。請注意,如果在處理過程中引發(fā)異常,則會調用errback.
- method(字符串)-此請求的HTTP方法。默認為‘GET'。
- meta (dict) - Request.meta屬性的初始值。如果給出,則在此參數中傳遞的字典將被淺表復制。
- headers (dict)-請求頭。dict值可以是字符串(對于單值標頭)或列表(對于多值標頭)。如果None作為值傳遞,則將根本不發(fā)送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)
到此這篇關于Python中scrapy框架的ltem和scrapy.Request詳解的文章就介紹到這了,更多相關scrapy框架的ltem、scrapy.Request內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在IntelliJ IDEA 搭建springmvc項目配置debug的教程詳解
這篇文章主要介紹了在IntelliJ IDEA 搭建springmvc項目配置debug的教程詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09淺析final,finally,finalize 的區(qū)別
以下是對final,finally,finalize的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下2013-09-09Kafka是什么及如何使用SpringBoot對接Kafka(最新推薦)
這篇文章主要介紹了Kafka是什么,以及如何使用SpringBoot對接Kafka,今天我們通過一個Demo講解了在SpringBoot中如何對接Kafka,也介紹了下關鍵類?KafkaTemplate,需要的朋友可以參考下2023-11-11CentOS?7.9服務器Java部署環(huán)境配置的過程詳解
這篇文章主要介紹了CentOS?7.9服務器Java部署環(huán)境配置,主要包括ftp服務器搭建過程、jdk安裝方法以及mysql安裝過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07