摘要:本文利用数据库mysql、后端flask、前端vue设计了优快云首页数据抓取系统,实现了普通用户抓取优快云首页帖子数据,管理员用户管理普通用户抓取数据权限的机制。
总体效果,首页:
管理员用户登录:
普通用户登录:
管理员取消权限后
主要实现以下几点:
1.前后端分离,前端使用vue设计页面,后端使用python语言的flask框架建立接口。
2.设计爬虫,使用selenium操纵edge浏览器驱动抓取优快云首页帖子数据的作者、点赞数、踩数、标题、链接,满足robots规则。(优快云:我发布的贴子抓取我自己*^____^*)。
3.用户验证,管理员统一管理用户的抓取权限。
4.数据安全验证,采用基本的MD5签名验证。
5.个性化操作日志和参数单独文件配置(小型项目无所谓,中大型项目很重要)。
主要用到的语言或工具:python、js(vue.js)、flask、vue、mysql、selenium。
1.数据库mysql
本地创建数据库:
create database if not exists csdn default charset utf8 collate utf8_general_ci;
进入数据库
use csdn;
创建表(这里用了小写的数据库关键词):
create table users (id int auto_increment primary key,#主键
name varchar(32) not null,#名字
phone varchar(16) not null,#手机号
userType enum("root","user") not null,#用户类别,管理员还是普通用户
GetLabel enum("0","1") not null,#是否有权限,1表示有,0表示没有
created_at timestamp null default current_timestamp,#账户创建时间
password varchar(64) not null);密码
这里注册了几个用户。
2.后端flask
后端提供的接口:登录接口、注册普通用户接口、爬虫接口、获取用户信息列表、取消/增加普通用户抓取权限的接口。接口文件app.py的代码为
import time
from flask import Flask, request
import logging
import pymysql,config
import va
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor #多线程工具
from flask_cors import CORS #跳过跨域验证的工具
app = Flask(__name__)
CORS(app)
# 配置日志
logging.basicConfig(filename='app.log', # 指定日志文件名
level=logging.DEBUG, # 设置日志级别
format='%(asctime)s - %(levelname)s - %(message)s') #设置时间格式
def sql_execute(sql):#sql执行函数
con = pymysql.connect(host=config.host,
user=config.user,
passwd=config.password,
db=config.db, # 数据库名
charset=config.charset) # 字符集
with con.cursor() as cursor:
cursor.execute(sql) # 执行查询sql
result = cursor.fetchall()
con.commit()
con.close() # 关闭连接
return result
@app.route('/login', methods=['POST'])
def login():#登录接口
try:
api_data = request.get_json()
if not va.Verify.verify_api_data(api_data=api_data):#验证数据的完整性
app.logger.error(f"登录信息{api_data}数据安全验证失败")
return {
"msg":"数据安全验证失败",
"data":""
}
loginName = api_data['username']
loginPwd = api_data['password']
querySql = f"select * from users where phone='{loginName}'"
query_result = sql_execute(sql=querySql)
if len(query_result) == 0:#如果账号查不到
app.logger.error(f"错误的登录账号:{loginName}")
return {
"msg": "账号不存在!"