Scrapy框架的學習(6.item介紹以及items的使用(提前定義好欄位名))
阿新 • • 發佈:2019-01-13
在Scrapy框架中的items.py的作用
1.可以預先定義好要爬取的欄位 items.py
import scrapy class TencentItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() """定義好欄位,並不代表真正的值,只是佔一個位置,用的時候直接賦值就行""" position = scrapy.Field() category = scrapy.Field() date = scrapy.Field()
2. 把欄位定義好之後 ,就可以在爬蟲中進行使用
在用的時候, item的鍵名要和在items.py裡面定義好的欄位名稱一致
import scrapy ''' 匯入不同爬蟲的類欄位''' from tencent.items import TencentItem,TencentItem2,TencentItem3 class TencentSpiderSpider(scrapy.Spider): name = 'tencent_spider' allowed_domains = ['tencent.com'] start_urls = ['https://hr.tencent.com/position.php'] def parse(self, response): tr_list = response.xpath("//table[@class='tablelist']//tr")[1:-1] for tr in tr_list: """使用定義好的類""" item = TencentItem() """裡面的鍵名,必須提前在items裡面定義好之後才能用""" item["position"] = tr.xpath("./td/a/text()").extract_first() item["category"] = tr.xpath(".//td[2]/text()").extract_first() item["date"] = tr.xpath(".//td[5]/text()").extract_first() yield item
3. 如果想在pipelines.py中使用的方法是大同小異,只是在進行處理的時候item傳過來的是一個類物件,要對其進行相應 的 轉化
'''分別匯入不同爬蟲的欄位類''' from tencent.items import TencentItem, TencentItem2, TencentItem3 class TencentPipeline(object): def process_item(self, item, spider): """使用item的時候這裡接收的是TencentItem類的物件,我們可以把它轉化字典""" print(dict(item)) '''針對與不同的爬蟲欄位類的物件,做不同的處理''' return item
4. 這樣做有什麼好處呢,個人理解:
(1) 可以直接看items.py,可以看出來要爬取那些欄位
(2) 防止我們在item["鍵名"] 輸入鍵名的時候輸入錯誤
有多個爬蟲時Item的處理
例如有個騰訊爬蟲、有個京東爬蟲,怎樣處理
1. 在items.py裡面建立不同的類,分別儲存各自的欄位
class TencentItem(scrapy.Item): """騰訊爬蟲要爬取的欄位""" """定義好欄位,並不代表真正的值,只是佔一個位置,用的時候直接賦值就行""" position = scrapy.Field() category = scrapy.Field() date = scrapy.Field() class JdItem(scrapy.Item): """京東爬蟲要爬取的欄位""" """定義好欄位,並不代表真正的值,只是佔一個位置,用的時候直接賦值就行""" position = scrapy.Field() category = scrapy.Field() date = scrapy.Field()
2. 然後在不同的爬蟲程式裡使用對應的類即可
在騰訊的爬蟲裡 , 匯入和使用
import scrapy # 匯入不同爬蟲的類欄位 from tencent.items import TencentItem class TencentSpiderSpider(scrapy.Spider): pass def parse(self, response): pass for tr in tr_list: """使用定義好的騰訊爬蟲的類的欄位""" item = TencentItem() yield item
在京東的爬蟲中,可以這樣使用
import scrapy # 匯入不同爬蟲的類欄位 from JD.items import JdItem class JdSpiderSpider(scrapy.Spider): pass def parse(self, response): pass for tr in tr_list: """使用定義好的騰訊爬蟲的類的欄位""" item = JdItem() yield item
3. 對於多個爬蟲,在pipelines,py中可以進行判斷,分別對不同的爬蟲的欄位進行不同的處理
isinstance() 函式來判斷一個物件是否是一個已知的型別
'''分別匯入不同爬蟲的欄位類''' from tencent.items import TencentItem, JdItem2 class TencentPipeline(object): def process_item(self, item, spider): '''針對與不同的爬蟲欄位類的物件,做不同的處理''' if isinstance(item, TencentItem): pass if isinstance(item, JdItem2): pass return item