前期工作

  • Scrapy
  • pymongo
  • MongoDB

通过 pymongo 库连接 MongoDB

在这里,需要用到的是 pymongo 库里面的 MongoClient,向该方法传入 MongoDB 的 IP 及 端口。

1
2
3
client = pymongo.MongoClient('mongodb://your ip address:27017/')
# 或者
client = pymongo.MongoClient(host='your ip address', port=27017)

创建连接对象后,需要指定操作哪个数据库,这里为 pymongo 数据库。

1
db = client["pymongo"]

由于我的 MongoDB 数据库启用了 auth 认证,没有的跳过。需要验证密码。

1
db.authenticate("***", "***")

最后,声明了 Collection 对象,用于指定需要操作的集合。

1
col = db["test"]

可以往里面插入一条数据测试连接是否有效,使用 insert_one() 方法,该方法在执行后会返回一个 _id 值。
运行结果为:

Terminal.png
Terminal.png
Navicat.png
Navicat.png

完整代码:

1
2
3
4
5
6
7
8
9
10
11
import pymongo

client = pymongo.MongoClient('mongodb://your ip address:27017/')
db = client["pymongo"]
db.authenticate("***", "***")
col = db["test"]

dict = {"id": "1", "name": "test"}

x = col.insert_one(dict)
print(x)

在 Scrapy 中使用

在 Scrapy 中的数据处理部分是写在 pipelines 文件内的,与上面步骤相同,那么直接贴完整代码吧:

pipelines.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pymongo
from .settings import mongo_host, mongo_port, mongo_db_name, mongo_db_collection


class NeteasePipeline(object):
def __init__(self):
host = mongo_host
port = mongo_port
dbname = mongo_db_name
cname = mongo_db_collection
client = pymongo.MongoClient(host=host, port=port)
db = client[dbname]
self.post = db[cname]
db.authenticate("***", "***")

def process_item(self, item, spider):
data = dict(item)
self.post.insert(data)
return item

其中,配置的部分我写在了 settings.py 中

settings.py
1
2
3
4
5
6
mongo_host = "your ip address"
mongo_port = 27017
mongo_db_name = "***"
# 日期作为collection名字
date = str(datetime.date.today())
mongo_db_collection = date

最后,在 settings.py 中进行相应的设置,数值越小优先级越高。

settings.py
1
2
3
4
5
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'netease.pipelines.NeteasePipeline': 300,
}