启动 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)

mongodb已存在不插入,不存在插入

如果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)
Logo

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

更多推荐