iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 14
0
AI & Data

蟲王養成 - scrapy系列 第 14

DAY 14 : scrapy pipeline data insert mongodb

先前發文
DAY 01 : 參賽目的與規劃
DAY 02 : python3 virtualenv 建置
DAY 03 : python3 request
DAY 04 : 使用beautifulsoup4 和lxml
DAY 05 : select 和find 抓取tag
DAY 06 : soup解析後 list取值
DAY 07 : request_header_cookie 通過網頁18限制
DAY 08 : ppt內文爬取
DAY 09 : 資料處理 split replace strip
DAY 10 : python csv 寫入 和dict 合併
DAY 11 : python class function
DAY 12 : crawl 框架 scrapy 使用
DAY 13 : scrapy 架構
DAY 14 : scrapy pipeline data insert mongodb


使用pipeline前 先測試一下一般的code是否正常執行

sudo apt-get install mongodb

先準備pymongo pip3 install pymongo

sudo service mongod start啟動service

在terminal 上打mongo就可進入mongo shell進行操作指令了

show dbs
use 資料庫名稱
show collections
db.資料表名稱.find()

來寫個測試code吧

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["IT_db"]
mycol = mydb["IT_coll"]

mydict = { "name": "John", "address": "Highway 37" }

x = mycol.insert_one(mydict)

再到mongo shell 查看是否有自動跑出IT_db , 並看到collection裡資料是否存在

就可以開始寫scrapy 的 pipeline了

把前面寫的ppt spider拿出來用 , 先設定 settings.py找到ITEM_PIPELINES 把{}裡預設的

mark(註解)掉 , 並新增' pipeline上一層的目錄名稱.pipelines.MongoDBPipeline': 300,
再加上

MONGODB_URI = 'mongodb://localhost:27017'
MONGODB_DB_NAME = 'IT_db'
MONGODB_DB_COL = 'IT_coll'

並找到pipelines.py 寫mongodb功能

import pymongo

寫一個mongo功能

class MongoDBPipeline:
    print('Pipeline')
    def open_spider(self, spider):
        db_uri = spider.settings.get('MONGODB_URI')
        db_name = spider.settings.get('MONGODB_DB_NAME')
        db_coll = spider.settings.get('MONGODB_DB_COL')
        db_client = pymongo.MongoClient('mongodb://localhost:27017')
        self.coll = db_client[db_name][db_coll]

    def process_item(self, item, spider):
        self.insert_article(item)
        return item

    def insert_article(self, item):
        item = dict(item)
        print(item)
        self.coll.insert_one(item)

    def close_spider(self, spider):
        self.db_client.close()

從昨天的架構圖可以知道 , 跑到pipeline是已經爬完準備後續處理資料或是寫入資料的部份了

從setting 拿取變數 並進行連線 , 把collection給予self.變數(可以給其他function呼叫)

再來process_item接取spider爬完的item

並給 insert_article的function轉成dict格式並寫入資料

之後就可以用基本的mongo shell或是寫個python來check自己的資料是否已寫入

今日歌曲~

與非門与非门 - 茄子


上一篇
DAY 13 : scrapy 架構
下一篇
DAY 15 : scrapy middleware proxy
系列文
蟲王養成 - scrapy30

尚未有邦友留言

立即登入留言