1. 程式人生 > >Scrapy框架的學習(6.item介紹以及items的使用(提前定義好欄位名))

Scrapy框架的學習(6.item介紹以及items的使用(提前定義好欄位名))

在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