天天看點

python爬蟲scrapy連接配接mongodb_Scrapy爬蟲,資料存入MongoDB

一、開始

首次登陸MongoDB,由于沒有設定使用者管理權限,會給出警告,“WARNING: Access control is not enabled for the database”。警告(warning)和錯誤(error)不一樣,你完全可以忽略警告,并不影響你使用MongoDB。

即使你沒有建立管理者權限,在沒有賬号和密碼的情況下也可以對資料庫進行操作。但是從安全的角度考慮,最好是給要操作的資料庫設定賬号和密碼。

stackoverflow上關于這個問題,有詳細的解答,連結如下:

MongoDB: Server has startup warnings ''Access control is not enabled for the database''​stackoverflow.com

python爬蟲scrapy連接配接mongodb_Scrapy爬蟲,資料存入MongoDB

MongoDB: Server has startup warnings​stackoverflow.com

python爬蟲scrapy連接配接mongodb_Scrapy爬蟲,資料存入MongoDB

案例主要是參考了 崔慶才 Scrapy 爬蟲架構入門案例詳解。隻是在最後連接配接MongoDB資料庫的時候,由于他的是沒有密碼的連接配接,我設定過密碼,是以在連接配接方式上,加入了user,password。其他沒有什麼差別。

寫這篇文章,也是為了理順自己的思路,順便動手實踐一下。畢竟看别人的代碼和自己寫代碼運作很不一樣,即使你完全照着别人的代碼寫,由于配置環境或者版本問題,都會或多或少出現一些問題。

學習前期都是“依葫蘆畫瓢”,看别人是怎麼做的,别人的思路是怎樣。後期積累多了,遇到不同的業務場景,才會加入一些自己的思考。

二、MongoDB建立使用者

建立userAdminAnyDatabase角色,用來管理使用者,可以通過這個角色來建立、删除使用者。

> use admin

switched to db admin

> db.createUser(

... {

... user: "userAdmin",//使用者名

... pwd: "123",//密碼

... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

... }

... )

Successfully added user: {

"user" : "dba",

"roles" : [

{

"role" : "userAdminAnyDatabase",

"db" : "admin"

}

]

}

建立一個資料庫 tutorial,并建立一個角色 simple,可以對tutuorial資料庫進行讀寫

> use tutorial

switched to db tutorial

> db.createUser({user:"simple",pwd:"test",roles:[{role:"readWrite",db:"tutorial"}]})

Successfully added user: {

"user" : "simple",

"roles" : [

{

"role" : "readWrite",

"db" : "tutorial"

}

]

}

補充role使用者角色知識:Read:允許使用者讀取指定資料庫

readWrite:允許使用者讀寫指定資料庫

dbAdmin:允許使用者在指定資料庫中執行管理函數,如索引建立、删除,檢視統計或通路system.profile

userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、删除和管理使用者

clusterAdmin:隻在admin資料庫中可用,賦予使用者所有分片和複制集相關函數的管理權限。

readAnyDatabase:隻在admin資料庫中可用,賦予使用者所有資料庫的讀權限

readWriteAnyDatabase:隻在admin資料庫中可用,賦予使用者所有資料庫的讀寫權限

userAdminAnyDatabase:隻在admin資料庫中可用,賦予使用者所有資料庫的userAdmin權限

dbAdminAnyDatabase:隻在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin權限。

root:隻在admin資料庫中可用。超級賬号,超級權限

三、Scrapy爬蟲

(1)建立項目

由于我把scrapy爬蟲項目,都放在了scrapy_example檔案夾中,是以會先進入相應的檔案及,再執行指令

C:\Users\renqing.song>cd E:\Program Files\scrapy_example

C:\Users\renqing.song>e:

E:\Program Files\scrapy_example>python -m scrapy startproject tutorial

New Scrapy project 'tutorial', using template directory 'E:\\Program Files\\Python 3.6.3\\lib\\site-packages\\scrapy-1.5.0-py3.6.egg\\scrapy\\templates\\project', created in:

E:\Program Files\scrapy_example\tutorial

You can start your first spider with:

cd tutorial

scrapy genspider example example.com

(2)生成爬蟲檔案

E:\Program Files\scrapy_example>cd tutorial

E:\Program Files\scrapy_example\tutorial>python -m scrapy genspider quotes quotes.toscrapy.com

(3)項目結構

用pycharm打開檔案結構如下,__init__.py和scrapy.cfg基本用不上

(4)建立Item

item是儲存爬取資料的容器,它的使用方法和字典類似。建立item需要繼承scrapy.item類,并且定義類型為scrapy.Field的類屬性來定義一個Item。

修改items.py如下

import scrapy

class QuoteItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

text = scrapy.Field()

author = scrapy.Field()

tags = scrapy.Field()

(5)爬蟲檔案

name:每個項目裡面,名字是唯一的,用來區分不同的爬蟲項目

allowed_domains:允許爬取的域名,如果初始或者後續請求連結不在這個域名下的,就會被過濾掉。allowed_domains也可以注釋掉,不是必須的。

start_urls:包含了spider啟動時爬取的url清單,初始請求是由它定義的。

parse:start_urls裡面的連結構成的請求完成下載下傳後,傳回的response對象,就會傳遞給parse函數,parse函數負責解析傳回的response,提取資料或者進一步生成要處理的請求。

import scrapy

from tutorial.items import QuoteItem

class QuotesSpider(scrapy.Spider):

name = 'quotes'

allowed_domains = ['quotes.toscrape.com']

start_urls = ['http://quotes.toscrape.com/']

def parse(self, response):

quotes = response.css('.quote')

for quote in quotes:

item = QuoteItem()

item['text'] = quote.css('.text::text').extract_first()

item['author'] = quote.css('.author::text').extract_first()

item['tags'] = quote.css('.tags .tag::text').extract()

yield item

next = response.css('.pager .next a::attr("href")').extract_first()

url = response.urljoin(next)

yield scrapy.Request(url = url,callback = self.parse)

(6)使用Item Pipeline

如果需要将爬取下來的資料,儲存到資料庫,就需要使用Item Pipeline來實作。

Item Pipeline意為資料管道,當成Item後,它會自動被送到Item Pipeline進行處理。Item Pipeline主要有以下作用:

1.清理html資料

2.驗證爬取資料,檢查爬取字段

3.查重并丢棄重複内容

4.将爬取結果儲存到資料庫

實作Item Pipeline很簡單,隻需要定義一個類實作process_item方法即可,并且在Setting.py配置檔案中啟用ITEM_PIPELINES

這個方法主要有兩個參數,一個是item,每次spider生成的item都會作為參數傳遞過來;另外一個是spider,就是spider的執行個體。

連結MongoDB資料庫有兩種方法,一種需要在setting.py配置相應的參數,一種是不需要配置,直接初始化的時候,傳入相應的值即可。

1.初始化的時候,直接傳入相應的值

from pymongo import MongoClient

class MongoPipeline(object):

def __init__(self,databaseIp = '127.0.0.1',databasePort = 27017,user = "simple",password= "test", mongodbName='tutorial'):

client = MongoClient(databaseIp,databasePort)

self.db = client[mongodbName]

self.db.authenticate(user,password)

def process_item(self, item, spider):

postItem = dict(item) # 把item轉化成字典形式

self.db.scrapy.insert(postItem) # 向資料庫插入一條記錄

return item # 會在控制台輸出原item資料,可以選擇不寫

2.在setting.py配置檔案中設定參數,調用setting.py檔案中的參數值

setting.py配置參數如下,使用者名和密碼都是在MongoDB建立使用者時,建立好的

MONGO_HOST = "127.0.0.1" # 主機IP

MONGO_PORT = 27017 # 端口号

MONGO_DB = "tutorial" # 庫名

MONGO_COLL = "scrapy" # collection名

MONGO_USER = "simple" #使用者名

MONGO_PSW = "test" #使用者密碼

pipelines.py 檔案中,利用 from scrapy.conf import setting可以讀取配置檔案

import pymongo

from scrapy.conf import settings

class MongoPipeline(object):

def __init__(self):

# 連結資料庫

client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])

self.db = client[settings['MONGO_DB']] # 獲得資料庫的句柄

self.coll = self.db[settings['MONGO_COLL']] # 獲得collection的句柄

# 資料庫登入需要帳号密碼的話

self.db.authenticate(settings['MONGO_USER'], settings['MONGO_PSW'])

def process_item(self, item, spider):

postItem = dict(item) # 把item轉化成字典形式

self.coll.insert(postItem) # 向資料庫插入一條記錄

return item # 會在控制台輸出原item資料,可以選擇不寫

四、執行爬蟲

E:\Program Files\scrapy_example\tutorial>python -m scrapy crawl quotes

爬蟲結束後,在tutorial資料庫中,會生成一個scrapy的collection(類似mysql裡面表的table概念)

五、結束

至此一個完整的scrapy爬蟲架構,基本完成,并實作了與MongoDB資料庫的連結。