PySpider 数据存储到mongoDB中
启动 PySpider打开浏览器,在地址栏输入:http://localhost:5000/
·
启动 PySpider
打开浏览器,在地址栏输入:http://localhost:5000/
安装pymongo
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com pymongo
注意: 在 MongoDB 中,数据库只有在内容插入后才会创建,就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
dblist = myclient.list_database_names()
# 判断数据库是否已存在
if "runoobdb" in dblist:
print("runoobdb数据库已存在!,创建了新的数据库runoobdb1")
mydb = myclient['runoobdb1']
else:
print("runoobdb数据库已创建!")
mydb = myclient['runoobdb']
# # 判断集合是否已存在
# collist = mydb.list_collection_names()
# if "tables" in collist: # 判断 tables 集合(表)是否存在
# print("tables 集合已存在!")
# col = mydb['tables1'] # 进入集合
# else:
# print("tables 集合已创建!")
# col = mydb['tables'] # 进入集合
col = mydb['tables'] # 进入集合
# col.insert({"题目":"\\int e^{x}+5xdx","答案":"=e^{x}+\\frac{5x^{2}}{2}+C"})
col.update_one({'题目':'1123'},{'$setOnInsert':{'答案':'1111'}}, upsert=True)
如果upsert设为true。
当记录存在,则不执行$setOnInsert中的操作,但要执行$set中的操作
当记录不存在,则同时执行$setOnInsert,$set操作
所以,判断记录是否存在,可以只写 $setOnInsert 操作
详细介绍了 $setOnInsert 方法的使用规则。
注意:
需要使用的是在python和MongoDB交互过程中使用$setOnInsert参数。
不然报语法错误
完成了以上的测试,下面可以开始使用pyspider了
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2021-02-01 10:26:51
# Project: new
import pymongo
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
}
# 连接数据库
def __init__(self):
# self.page = 1
self.totalpage = 1
self.base_url = 'https://www.chinca.org/CICA/Memberdynamics/List?p='
# //数据库配置,用的monggodb
self.myclient = pymongo.MongoClient(host='localhost',port=27017)
dblist = self.myclient.list_database_names()
# 判断数据库是否已存在
if "spider" in dblist:
print("spider 数据库已存在!,创建了新的数据库spider1")
self.mydb = self.myclient['spider1']
else:
print("runoobdb数据库已创建!")
self.mydb = self.myclient['spider']
# 表示每天执行一次
@every(minutes=24 * 60)
def on_start(self):
for i in range(1,self.totalpage+1):
self.crawl(self.base_url+str(i), callback=self.index_page,fetch_type='js')
# 表示数据10天后就过期了
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('.kerconrtbor .clearfix a').items():
self.crawl(each.attr.href, callback=self.detail_page)
@config(priority=3)
def detail_page(self, response):
title = response.doc('title').text(),
url= response.url,
from_ = response.doc('.releasetime > span:nth-child(1)').text(),
date_ = response.doc('div.industry-news > div:nth-child(4) > span').text(),
content = response.doc('#aspnetForm > div.ermainwih > div.ermain > div.ercon.clearfix > div.industry-news > p:nth-child(5)').text(),
Typesetting = response.doc('.releasetime > span:nth-child(2)').text()
# print(content)
return {
"title":title[0],
"url": url[0],
"from_":from_[0],
"date_": date_[0],
"content": content[0],
"Typesetting": Typesetting
}
# 如果没有这个函数,抓取到的数据将默认存储到 resultdb 本地的数据库
# 结果存入数据库中
# 接受detail_page返回结果
def on_result(self,result):
# 注意这里的if result:这句判断很重要,不然的会会报错,提示result是未定义类型的。
if result:
self.save_to_mongo(result)
# insert到mongo
def save_to_mongo(self,result):
print(result['title'])
print(result['Typesetting'])
if self.mydb['tables'].insert(result):
print('save to mongo',result)

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)