啟動框架開始爬取目標網頁start_url之后,需要從start_url這個字符串中提取一個特征值,作為MongoDB數據庫的collection名,再通過pipeline將item存儲。
大致流程:
根據框架流程來看是可以實現的,spider的處理在pipeline之前
pipeline中相關代碼:
import pymongo
class MongoPipeline(object):
#collection_name = 'Gsl6RoxfN'
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)
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):
self.db[self.collection_name].insert_one(dict(item))
return item
現在的問題就是如何將spider中的變量collection_name傳遞到pipeline中
感謝閱讀提問
Thanks in advance
引用 @玉帛 的方法,可以解決問題,實現“從MongoDB讀取start_url,對start_url進行處理,生成特征值,再將特征值傳遞給pipeline作為collection表名”的操作,具體解決方案如下。
Spider中:
def start_requests(self):
client = pymongo.MongoClient('localhost',27017)
db_name = 'Sina'
db = client[db_name]
collection_set01 = db['UrlsQueue']
datas=list(collection_set01.find({},{'_id':0,'url':1,'status':1}))
for data in datas:
if data.get('status') == 'pending':
url=data.get('url')
pattern='(?<=/)([0-9a-zA-Z]{9})(?=\?)'
if re.search(pattern,url):
collection_name=re.search(pattern,url).group(0)
start_url='https://weibo.cn/comment/'+collection_name+'?ckAll=1'
collection_set01.update({'url':url},{'$set':{'status':'proccessing'}})
break
else:
pass
client.close()
yield Request(url=start_url,callback=self.parse, cookies=cookie, meta={'collection_name':collection_name})
從數據庫中獲取start_url,提取特征值,并對其處理,帶meta參數發(fā)送request
def parse(self,response):
collection_name=response.meta['collection_name']
......
for i in range(0,len(node)):
item['collection_name']=collection_name
yield item
parse()從response中解析數據的同時提取回傳的meta參數
Pipeline中:
def close_spider(self, spider):
self.db['UrlsQueue'].update({'status':'proccessing'},{'$set':{'status':'finished'}})
self.client.close()
def process_item(self, item, spider):
self.collection_name=item.pop('collection_name')
self.db[self.collection_name].insert_one(dict(item))
return item
pop掉collection_name參數即可
非常感謝 @玉帛 的幫助
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統架構師,美國AngelEngineers Inc. 系統架構師。