Scrapy學習篇(四)之數據存儲


上一篇中,我們簡單的實現了一個博客首頁信息的爬取,並在控制台輸出,但是,爬下來的信息自然是需要保存下來的。這一篇主要是實現信息的存儲,我們以將信息保存到文件和mongo數據庫為例,學習數據的存儲,依然是以博客首頁信息為例。

編寫爬蟲

修改items.py文件來定義我們的item

Item 是保存爬取到的數據的容器;其使用方法和python字典類似。雖然你也可以在Scrapy中直接使用dict,但是Item提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。簡單的來說,你所要保存的任何的內容,都需要使用item來定義,比如我們現在抓取的頁面,我們希望保存 title,link, 那么你就要在items.py文件中定義他們,以后你會發現,items.py文件里面你所要填寫的信息是最簡單的了。

import scrapy

class CnblogItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

這樣就已經定義好了。

編寫spider文件

在項目中的spiders文件夾下面創建一個文件,命名為cnblog_spider.py我們將在這個文件里面編寫我們的爬蟲。先上代碼再解釋。

import scrapy
from cnblog.items import CnblogItem   #新添加

class Cnblog_Spider(scrapy.Spider):

    name = "cnblog"
    allowed_domains = ["cnblogs.com"]
    start_urls = [
     'https://www.cnblogs.com/',
    ]

    def parse(self, response):
        item = CnblogItem()    #新添加
        item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()   #修改
        item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()     #修改
        yield item   #新添加

下面主要對新添加或者修改的地方講解

  • 導入CnblogItem自定義類,注意:新建項目中帶有scrapy.cfg文件的那個目錄默認作為項目的根目錄,因此from cnblog.items import CnblogItem就是從cnblog項目里面的items.py文件里面導入我們自定義的那個類,名稱是CnblogItem,就是上面我們定義的那個CnblogItem ,只有導入了這個類,我們才可以保存我們的字段。
  • item = CnblogItem() 實例化,不多說。
  • item['title']和item['link'],前面已經說過,item其實就是可以簡單的理解為字典,這個地方就是相當於給字典里面的鍵賦值。
  • 最后yield item生成器,scrapy會將item傳遞給pipeline進行后續的處理,當然,前提是你打開了settings設置里面的設置項,相關的設置馬上就會說到。

修改pipelines.py文件,實現保存。

import pymongo   #別忘了導入這個模塊

class FilePipeline(object):
'''
實現保存到txt文件的類,類名這個地方為了區分,做了修改,
當然這個類名是什么並不重要,你只要能區分就可以,
請注意,這個類名待會是要寫到settings.py文件里面的。
'''
    def process_item(self, item, spider):
        with open('cnblog.txt', 'w', encoding='utf-8') as f:
            titles = item['title']
            links = item['link']
            for i,j in zip(titles, links):
                f.wrire(i + ':' + j + '\n')
        return item        
        

class MongoPipeline(object):
'''
實現保存到mongo數據庫的類,
'''

    collection = 'cnblog'  #mongo數據庫的collection名字,隨便

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
    '''
    scrapy為我們訪問settings提供了這樣的一個方法,這里,
    我們需要從settings.py文件中,取得數據庫的URI和數據庫名稱
    '''
        return cls(
            mongo_uri = crawler.settings.get('MONGO_URI'),
            mongo_db = crawler.settings.get('MONGO_DB')
        )

    def open_spider(self, spider):                  #爬蟲一旦開啟,就會實現這個方法,連接到數據庫
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):            #爬蟲一旦關閉,就會實現這個方法,關閉數據庫連接
        self.client.close()

    def process_item(self, item, spider):  
        '''
        每個實現保存的類里面必須都要有這個方法,且名字固定,用來具體實現怎么保存
        '''
        
        titles = item['title']
        links = item['link']
        table = self.db[self.collection]
        for i, j in zip(titles, links):
            data = {}
            data['文章:鏈接'] = i + ':' + j
            table.insert_one(data)
        return item
                
        

修改settings.py文件

之前,我們修改了兩個內容,ROBOTSTXT_OBEYDEFAULT_REQUEST_HEADERS,這里我們在之前的基礎上,在添加如下內容。

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
#新修改
ITEM_PIPELINES = {      
    'cnblog.pipelines.FilePipeline': 300,    #實現保存到txt文件
    'cnblog.pipelines.MongoPipeline': 400,     #實現保存到mongo數據庫
}
#新添加數據庫的URI和DB
MONGO_URI = 'mongodb://localhost:27017'  D
MONGO_DB = "cnblog"                   

對於新修改的內容簡單的解釋,如果你僅僅想保存到txt文件,就將后者注釋掉,同樣的道理,如果你僅僅想保存到數據庫,就將前者注釋掉,當然,你可以兩者都實現保存,就不用注釋任何一個。對於上面的含義,cnblog.pipelines.FilePipeline其實就是應用cnblog/pipelines模塊里面的FilePipeline類,就是我們之前寫的那個,300和400的含義是執行順序,因為我們這里既要保存到文件,也要保存到數據庫,那就定義一個順序,這里的設置就是先執行保存到文件,在執行保存到數據庫,數字是0-1000,你可以自定義。

運行爬蟲

進入到項目文件,執行
scrapy crawl cnblog
可以看到根目錄下生成了cnblog.txt的文件,mongo數據庫也新增了相應的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM