Scrapy學習篇(四)之資料儲存

2021-08-20 19:32:23 字數 3727 閱讀 8631

修改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 = [

'',]

defparse

(self, response):

item = cnblogitem() #新新增

item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract() #修改

item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract() #修改

yield item #新新增

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

修改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

deffrom_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]

defclose_spider

(self, spider):

#爬蟲一旦關閉,就會實現這個方法,關閉資料庫連線

self.client.close()

defprocess_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 =

#新修改

item_pipelines =

#新新增資料庫的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資料庫也新增了相應的內容。

Python爬蟲之Scrapy學習(基礎篇)

在爬蟲的路上,學習scrapy是乙個必不可少的環節。也許有好多朋友此時此刻也正在接觸並學習scrapy,那麼很好,我們一起學習。開始接觸scrapy的朋友可能會有些疑惑,畢竟是乙個框架,上來不知從何學起。從本篇起,博主將開啟scrapy學習的系列,分享如何快速入門scrapy並熟練使用它。本篇作為第...

scrapy提公升篇之配置

併發是指同時處理的request的數量。其有全域性限制和區域性 每個 的限制。scrapy預設的全域性併發限制對同時爬取大量 的情況並不適用,因此您需要增加這個值。增加多少取決於您的爬蟲能占用多少cpu。一般開始可以設定為 100 不過最好的方式是做一些測試,獲得scrapy程序占取cpu與併發數的...

scrapy 爬蟲儲存資料

scrapy儲存資訊的最簡單的方法主要有四種,o 輸出指定格式的檔案,命令如下 json格式,預設為unicode編碼 scrapy crawl itcast o teachers.json json lines格式,預設為unicode編碼 scrapy crawl itcast o teache...