0%

mongodb的操作及使用

安装

  • Windows安装

    下载地址 :www.mongodb.com

    下载完成之后一顿下一步即可安装。

  • Linux安装

    • 安装方法

      百度之很多,我使用的是Docker进行安装的,简单。

    • 基本操作

      • 配置远程及设置密码
        • 修改配置文件mongodb.conf中bind_ip将127.0.0.1改成0.0.0.0
        • ```
          • security:
            authorization: disabled ->改为enable
            1
            - 添加管理员
            db.createUser({user:’username’,pwd:’pwd’,roles:[‘readWrite’,db:’admin’]})
            db.createUser({user:’admin’, pwd:’admin’, roles: [{ role: “userAdminAnyDatabase”, db: “admin” }]})
            1
            2
            3
            - Docker安装
            - 安装方法
            pull最新版本mongp
            docker pull mongo
            1
            运行 `--name`设置名称 `-v`挂载数据 `-p`端口映射 `-d`后台运行
            docker run –name mongodb -v ~/docker/mongo:/data/db -p 27017:27017 -d mongo
            1
            设置用户进入`mongodb`容器进行设置
            docker exec -it mongodb bash
            mongo

            进入 admin 的数据库

            use admin

            创建管理员用户

            db.createUser(
            {
            user: “admin”,
            pwd: “pwd”,
            roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]
            }
            )

            创建有可读写权限的用户. 对于一个特定的数据库, 比如’demo’

            db.createUser({
            user: ‘username’,
            pwd: ‘pwd’,
            roles: [{role: “readWrite”, db: “demo”}]
            })
            1
            2
            3
            - 远程访问

            在 `mongodb` 的容器当中操作修改`bindIP`
            #更新源
            apt-get update

            安装 vim

            apt-get install vim

            修改 mongo 配置文件

            vim /etc/mongod.conf.orig

            修改bindIP为0.0.0.0

            bindIp: 0.0.0.0
            1
            2
            3
            4
            5
            6
            7
            #### pymongo操作
            - 增
            ```python
            #插入一条数据
            insert_one()
            #插入多条数据
            insert_many
  • 1
    2
    3
    4
    5
    6
    #删除单条
    delete_one({查询条件})
    #删除多条
    delete_many({查询条件})
    #删除说有
    delete_many({})
  • 1
    update_many({查询}, { "$set": { 修改 } }) 或 update_one({查询}, { "$set": { 修改 } })
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    #查询多条数据
    find()
    #查询一条数据
    find_one()
    #查询指定字段
    find({},{ "_id": 0, "name": 1, "alexa": 1 })
    `0`为不显示,`1`为显示
    #查询条件
    find({ "name": 条件 }) 或 find_one({ "name": 条件 })

    fastapi+mongodb线报爬虫案例

  • 爬取及去重

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        #科学刀最新线报
    def spider_kxd(self):
    site = '科学刀'
    soup = Spider(kxd_api).soup
    for soup_a in soup.xpath('//a[@class="s xst"]'):
    title = soup_a.text
    link = soup_a.get('href')
    msg = { "title": title, "link": link, "site": site ,"pubtime":int(time.time())}
    q = mycol.find_one({ "link": link })
    if q == None:
    mycol.insert_one(msg)
    print(title,'采集成功!')

    通过mycol.find_one({ "link": link })查询爬取地址是否已在数据库中,为空则进行爬取。

  • fastapi

    1
    2
    3
    4
    5
    6
    7
    8
    @app.get('/')
    def index(request: Request):
    p = mycol.find().sort([("pubtime",-1)]).limit(20)
    data = []
    for i in p:
    msg = {'title':i['title'],'link':i['link']}
    data.append(msg)
    return data

    通过sort进行排序(1为正序,-1为倒序),limit截取显示数量。

之前有一个叫IBMYes的项目,是利用IBM Cloud免费云服务器搭建科学上网的V2ray服务,江湖传闻速度很快搭配CF可上4k。

然鹅我部署之后,上网貌似不成功,由于有更方便稳定的免费服务就没有过多的折腾,刚好看了几天fastapi的教程,想着用这个试试搭个线报网站。

爬取即时线报,推送到电报群进行提醒,通过js调用fastapi相关数据到html页面进行展示。

效果展示:最新线报

注册IBM免费云服务器

网址: IBM Cloud

无须信用卡,只需要邮箱即可。

注册很简单,略过不提。

注册成功登录之后,创建一个Cloud Foundry 应用程序,选择达拉斯 256M python

安装IBM客户端

具体步骤看这里
安装,登录等等。。。

Github Actions 设置自动开机

按照IBMYes项目相关设置,设置10天重启一次服务即可。

线报采集

用python写一个简单的爬虫,大致代码如下,四个目标网站,利用requests+lxml库获取目标网站线报的url和title并写入数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kxd_api = 'https://www.kxdao.net/forum-42-1.html'
wgzj_api = 'http://www.wgzj.cn/bbs/forum-2-1.html'
xb0818_api = 'http://www.0818tuan.com/list-1-0.html'
leyu_api = 'https://bbs.leyuz.net/f/xianbao'

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}

class Spider(object):
def __init__(self,url=None):
if url!=None:
self.url = url
self.res = requests.get(url,headers=headers)
#self.res.encoding = "utf-8"
self.soup = etree.HTML(self.res.text)

#科学刀最新线报
def spider_kxd(self):
site = '科学刀'
soup = Spider(kxd_api).soup
for soup_a in soup.xpath('//a[@class="s xst"]'):
title = soup_a.text
link = soup_a.get('href')
if Message.get_or_none(Message.link==link):
pass
else:
Message.create(title=title,link=link,site=site)

如果需要采集之后推送到电报群或微信群使用相应的telegram-python-bot或wxpy库即可。

fastapi

fastapi字面意思是一个快的api库,通过fastapi将线报信息转换为api接口,通过网页进行调用。
大致代码如下:

1
2
3
4
5
6
7
8
@app.get("/xb/")
def xb(request: Request):
p = Message.select(Message.title,Message.link).order_by(Message.pubtime.desc()).limit(10)
data = []
for q in p:
msg = {'title':q.title,'link':q.link}
data.append(msg)
return data

部署

创建一个manifest.yml文件,内容如下:

1
2
3
4
5
6
---
applications:
- name: yourname
random-route: true
memory: 256M

创建一个Procfile,内容如下:

1
web: gunicorn -w 3 -k uvicorn.workers.UvicornWorker main:app

创建一个requirements.txt,内容为你所项目所使用的各类依赖库。

具体步骤看这里

这个博客兜兜转转多少次了。

说明

在Github上创建两个仓库,一个私库存放博客源码,一个用户名.github.io存放生成的public文件。

创建ssh密钥对

1
$ ssh-keygen -f github-deploy-key
  • 打开 用户名.github.io 的仓库,点击 setting / deploy key ,然后点击 add new key,名称填写 HEXO_DEPLOY_PUB ,值填写上一步生成的公钥(.pub文件)里面的内容,然后勾选 allow write,提交。
  • 打开私库,添加 setting / secrets / add new key,名称为 HEXO_DEPLOY_PRI,值为生成ssh密钥对之私钥内容,提交。

创建 github action workflow

在私库中点击 Actions,新建一个workflow。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
name: HEXO CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [10.x]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name "设置用户名"
git config --global user.email "设置邮箱"
- name: Install dependencies
run: |
npm i -g hexo-cli
npm install hexo-deployer-git --save
npm i
- name: Generate static blog file
run: |
hexo generate
- name: Deploy to github page
run: |
hexo deploy

修改私库中部署地址

1
2
3
4
deploy:
type: git
repo: [email protected]:username/username.github.io.git
branch: master

绑定域名

在私库博客源文件source文件夹中新建一个CNAME的文件,内容为你要绑定的域名,然后在域名服务商处解析域名cname到username.github.io。

部署

在私库源文件source/_posts中添加md格式的博文,然后push,即可自动部署成功。