時間:2023-06-03 14:00:01 | 來源:網(wǎng)站運營
時間:2023-06-03 14:00:01 來源:網(wǎng)站運營
第三章 第一節(jié) Item與Pipeline:如果覺得文章對您產(chǎn)生幫助的話, 歡迎關(guān)注Python開發(fā)之路(微信公眾號: python-developer), 獲取更多教程import scrapyclass ArticleItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() content = scrapy.Field()
Item類繼承的dict類型, 所以操作的方法和dict是一樣的item = ArticleItem()item['title'] = '這是一個文章的標題'item['url'] = 'http://www.baidu.com'# 獲取一個item的值item.get('title')# 修改item的值item['title'] = '這是修改后的標題'# 獲取所有的keyitem.keys()# 從dict中創(chuàng)建一個itemArticle({'title': '這是另外一個標題', 'url': 'http://www.qq.com'})# 判斷key是否存在'title' in item# 復(fù)制一個itemitem.copy()
process_item(self, item, spider)現(xiàn)在可以查看一個pipeline的例子
每個item被傳入pipeline后的實際處理類, item是傳入的item, spider是指產(chǎn)生item的爬蟲
open_spider(self, spider)
當(dāng)指定的爬蟲啟動的時候被執(zhí)行到的方法spider
: 被啟動的爬蟲
close_spider(self, spider)
當(dāng)爬蟲被關(guān)閉的時候調(diào)用的方法spider
: 被關(guān)閉的爬蟲
from_crawler(cls, crawler)
當(dāng)pipeline類被創(chuàng)建的時候調(diào)用的方法
from scrapy.exceptions import DropItemclass ArticlePipeline(object): def process_item(self, item, spider): if 'title' not in item: raise DropItem('Missing title in %s' item) else: # 存入數(shù)據(jù)庫或者別的處理 return item # return item供別的pipeline繼續(xù)處理 def open_spider(self, spider): spider.logger.info('pipeline被創(chuàng)建了!') def close_spider(self, spider): spider.logger.info('pipeline被關(guān)閉了')
ITEM_PIPELINES = { 'testSpider.pipelines.ArticlePipeline': 300,}
前面是指向pipeline的模塊路徑, 后面的300是優(yōu)先級, 執(zhí)行順序是優(yōu)先級從小到大。 所以當(dāng)item產(chǎn)生的時候, 也是從較低的pipeline類中處理, 如果有return item
, 則會繼續(xù)在較高的pipeline中繼續(xù)執(zhí)行, 直到完畢。http://www.ccidcom.com
這個網(wǎng)站,http://www.ccidcom.com/yaowen/index.html
# items.pyimport scrapyclass ArticleItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field()
# pipelines.py# -*- coding: utf-8 -*-from scrapy.exceptions import DropItemclass ArticlePipeline(object): def __init__(self): self.title_sets = set() def process_item(self, item, spider): # 標題已存在, 則忽略, 否則輸出 if item['title'] in self.title_sets: raise DropItem('重復(fù)的標題: %s' % item['title']) else: self.title_sets.add(item['title']) # 這里可以換成保存到數(shù)據(jù)庫的方法 print(item) return item def open_spider(self, spider): spider.logger.info('pipeline被啟動了!!!') def close_spider(self, spider): spider.logger.info('pipeline被關(guān)閉了?。?!')
現(xiàn)在將編寫好的pipeline加入到settings.py文件# settings.pyITEM_PIPELINES = { 'ccidcom.pipelines.ArticlePipeline': 300,}
# -*- coding: utf-8 -*-import scrapyfrom ccidcom.items import ArticleItemclass CcidcomspiderSpider(scrapy.Spider): name = 'ccidcomSpider' allowed_domains = ['ccidcom.com'] def start_requests(self): yield scrapy.Request('http://www.ccidcom.com/yaowen/index.html') def parse(self, response): # 解析獲取到文章列表 article_list = response.css('div.article-item') # 循環(huán)selectorList for info in article_list: # 聲明一個item對象 item = ArticleItem() # 解析頁面并且將值賦值給item item['title'] = info.css( 'div.article-cont div.title a font::text').get() item['url'] = info.css( 'div.article-cont div.title a::attr("href")').get() # 將item yield到pipeline中 yield item
...# 這是我們開啟的pipeline2019-10-30 21:09:24 [scrapy.middleware] INFO: Enabled item pipelines:['ccidcom.pipelines.ArticlePipeline']# 這是pipeline的open_spider方法輸出的信息2019-10-30 21:09:24 [scrapy.core.engine] INFO: Spider opened2019-10-30 21:09:24 [ccidcomSpider] INFO: pipeline被啟動了!!!...# 以下都是在pipeline的process_item的方法輸出的數(shù)據(jù){'title': '對話河源高新區(qū)黨工委書記、管委會主任孫鋒:向全球手機創(chuàng)新高地邁進', 'url': '/yaowen/20190930/hb5cY2QtjOcUQc2D116xpnpcdg7ok.html'}{'title': '中國移動牽頭完成國際電信聯(lián)盟《IMT-2020及未來網(wǎng)絡(luò)智能化分級》標準', 'url': '/yaowen/20191030/h3OpxsU8p5UtmqwNQ170a1olcrlb0.html'}{'title': '信息通信展:“5G”議題刷屏 將成會議焦點', 'url': '/yaowen/20191029/lmntlfGvVHeE1PbAu1706elooedw4.html'}{'title': '2019中國5G終端創(chuàng)新峰會暨天鵝獎頒獎禮準備就緒,11月6日河源見!', 'url': '/yaowen/20191029/48d9nTli79xvCV4Jy1705qlyzz0b0.html'}{'title': '中興通訊前三季度財報發(fā)布:凈利41.3億元 研發(fā)投入占比14.6%', 'url': '/yaowen/20191028/D38FPmYP3uktcVR5T1703xpvip21o.html'}{'title': '11月6日!2019中國手機設(shè)計最高獎天鵝獎河源揭曉!', 'url': '/yaowen/20191028/feFeeyFbKf1CoFnsi1702sslwodhc.html'}{'title': '直擊七場對接會:“塊狀經(jīng)濟”如何快速駛?cè)牍I(yè)互聯(lián)網(wǎng)', 'url': '/yaowen/20191028/jmmTZgwIsP6Y5ywvl1702qze9ixog.html'}{'title': '李穎:三舉措推動工業(yè)互聯(lián)網(wǎng)平臺發(fā)展', 'url': '/yaowen/20191027/xMxGIGYNR9ecx4z6F1700n0ogf7hk.html'}{'title': '高通孟樸:5G商用前期主要服務(wù)大眾,2020年將有更多手機支持5G', 'url': '/yaowen/20191026/Jm68cP3rhpFcTnJDG16zxnf7bpgjo.html'}{'title': '英特爾2019第三季度財報發(fā)布:營收192億美元超預(yù)期', 'url': '/yaowen/20191025/1o6DjxQS5h9qVZKaY16zv9i7zbbq0.html'}...# 以下都是pipeline的close_spider2019-10-30 21:09:24 [scrapy.core.engine] INFO: Closing spider (finished)2019-10-30 21:09:24 [ccidcomSpider] INFO: pipeline被關(guān)閉了?。。?/code>
關(guān)鍵詞:
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。