一、同一目录下的py文件无法互相调用
自检查发现是文件路径问题。如下图的目录架构下,在views.py文件中调用db.py文件中的类或函数。
首先如下图设置根目录,默认是当前已配置环境的Python项目根目录。
如下图,按照已设置的根目录下的文件相对路径进行引入即可。
二、flask的自动渲染路径
简单写法如下,render_template的参数中,第一个参数为前端模板,后继参数均为模板中待填充的部分。
这一部分等具体化再补充。
三、layui的表格参数传递
前端等待后台数据的表格设置:
// 参考layui文档
<table class="layui-hide" id="spideuser" lay-filter="test"></table>
前端JavaScript:
// 参考layui文档
table.render({
elem: '#spideuser'
, height: 420
, url: '/spideuser/json/' //数据接口
, title: '备选用户表'
, cols: [[ //表头
{type: 'checkbox', fixed: 'left', width: 250}
, {field: 'name', title: '昵称', align: 'center', width: 485}
, {field: 'type', title: '类别', align: 'center', width: 485}
]]
});
// 处理复选框选中数据
table.on('checkbox(test)', function(obj){
datas.push(obj.data); // 向列表中添加选中行数据
});
数据接口即为表格需要的JSON数据所在的URL,可在后台通过函数生成。
""" 同样参考layui的demo表格的JSON数据格式 """
# 备选数据的json
@main.route('/spideuser/json/')
def data_to_json():
d = DBlink()
d.conndb()
cname = d.selectAllUser()
d.closedb()
datalist = []
for name in cname:
data = {'name': name[0], 'type': name[1]}
datalist.append(data)
jsdata = {"code": 0, "msg": "", "count": 1000, "data": datalist}
return jsonify(jsdata)
将前端数据传到后端:
function spaction(){
var ajax = XMLHttpRequest();
ajax.open( "post" , '/spideuser' , true );
ajax.setRequestHeader( "Content-Type" , "application/json" );
ajax.onreadystatechange = function () {
if( ajax.readyState == 4 ) {
if( ajax.status == 200 ) {
msg.innerHTML = ajax.responseText;
}
else {
msg.innerHTML = "HTTP请求错误!错误码:" + ajax.status;
}
}
};
// 必须要使用函数JSON.stringify将数据格式改为JSON,否则后台只能接收到Object字符串
ajax.send( JSON.stringify(datas) );
}
在后台再对数据进行转码即可。
四、微博线程池爬虫遇到的问题
1. 多线程时随机报错
检查发现一个问题是微博的时间显示,2020年显示的是xx月xx日 hh:mm
的格式;而2019年及之前是标准的datetime格式。另一个问题是,微博的设备不一定可见。
2. 线程池的最大线程数必须大于爬取微博页数
修改代码后解决。目测应该是多线程浏览器响应速度问题。
五、数据库操作遇到的问题
1. 插入操作错误
将爬取到的博文数据插入数据库时报错:
pymysql.err.InternalError: (1366, “Incorrect string value: ‘\xF0\x9F\x97\x93 \xE4…’ for column ‘博文内容’ at row 30”)
查询资料发现应该是数据库编码问题,因为部分特殊编码是4字节,而utf8只有3字节,需要使用utf8mb4进行编码。因此需要对表编码进行修改,同时相应字段编码也必须修改。
2. 查询操作错误
使用语句 sql = “SELECT * FROM 话题博文表 WHERE 话题 = %s AND 时段 LIKE ‘%分钟%’ ORDER BY 综合得分 DESC LIMIT 1” 进行查询操作时,报错:TypeError: not enough arguments for format string。
而使用语句 sql = “SELECT 话题, COUNT(*) AS 实时数量 FROM 话题博文表
WHERE 时段 LIKE ‘%分钟%’ AND 类别 = ‘实时’ GROUP BY 话题 ORDER BY 实时数量 DESC” 进行查询操作时,未报错。
报错说明运行sql时参数不够。但实际上检查两条语句发现,第一条语句还有%s
作为sql的参数,而'%分钟%'
的格式与%s
类似,可知%
是一个转义符号,则在第一条sql语句中使用%%
表示%
。
修改后的sql语句为:
sql = "SELECT * FROM 话题博文表 WHERE 话题 = %s AND 时段 LIKE '%%分钟%%' ORDER BY 综合得分 DESC LIMIT 1"
再次运行后成功。
参考文章
[1] https://blog.csdn.net/weixin_33937499/article/details/85961463
[2] https://www.layui.com/doc/
[3] https://blog.csdn.net/genglukuan/article/details/89328477