修改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_obey
和default_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...