若干知识点
1.数据库cursor.fetchall()
的返回类型:
out:
[{'detail_link': 'https://movie.douban.com/subject/1291546/'}, {'detail_link': 'https://movie.douban.com/subject/1292720/'}, {'detail_link': 'https://movie.douban.com/subject/1295644/'}]
2.cursor.fetchone()
:将只返回一条结果,返回单个字典类型如:
out:
{'detail_link': 'https://movie.douban.com/subject/1291546/'}
3.(1)SELECT * FROM table LIMIT 5,10;
// 检索记录行 6-15(因为索引从0开始)
(2)SELECT * FROM table LIMIT 5;
//检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。
(3)为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:SELECT * FROM table LIMIT 95,-1;
// 检索记录行 96-last.(据我实际测试这个加-1不行)
4.SELECT count(*) FROM test.comment250;
//据网友测试查询总条数用count(*)
优化,时间效率高。
新问题:
问题一
scrapy运行断点,也就是爬虫爬到一半,pycharm不名原因的关了。如何解决?
方法1
设置日志,看在哪出现的断点
在setting.py中进行以下设置可以被用来配置logging
# 默认: True,启用logging
LOG_ENABLED = True
# 默认: 'utf-8',logging使用的编码
LOG_ENCODING = "utf-8"
# 默认: None,在当前目录里创建logging输出文件的文件名
LOG_FILE = "name.log"
# 默认: 'DEBUG',log的最低级别
LOG_LEVEL = "DEBUG"
# 默认: False 如果为 True,进程所有的标准输出(及错误)将会被重定向到log中。
# 例如,执行 print "hello" ,其将会在Scrapy log中显示。
LOG_STDOUT = False
from datetime import datetime
# 当前时间
today = datetime.now()
# 日志文件按日期命名
log_file_path = "logs/log_{}_{}_{}.log".format(today.year, today.month, today.day)
# 日志输出级别
LOG_LEVEL = "DEBUG"
# 日志输出路径
LOG_FILE = log_file_path
日志是有了然而并没看出问题所在。但是以后应该会用到
方法2
在写入数据库时,用select语句检测是否写入过相应数据,而避免再次写入?(这个问题不用考虑了,因为第二个问题,我直接删库了(咦惹,你说傻不傻。))
当然其实也不用考虑,因为我设置了主键,是唯一的,不会再次写入相同的数据
问题二
发现有人用图片做名字,还有评论也可能会有图片,如何存储至mysql?
解决:以下仅是个人方法:*
首先
我修改了my.ini
的配置,全改成utf8mb4
格式了
我还干了这个,在mysql的命令行模式下依次执行如下命令,待都成功执行后,再重启mysql服务
set character_set_client = utf8mb4;
set character_set_connection = utf8mb4;
set character_set_database = utf8mb4;
set character_set_results = utf8mb4;
关闭mysql服务
**然后
**把数据库表给改了,部分设置加上了COLLATE utf8mb4_unicode_ci
(当然全加试试也可以,其实在表结尾加上ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
估计一劳永逸了吧。)
如下图示例:
create table comment250
( `movie_id` text COLLATE utf8mb4_unicode_ci,
`content` text COLLATE utf8mb4_unicode_ci,
`useful_num` varchar(255) COLLATE utf8mb4_unicode_ci,
`star` int,
`time` varchar(255) COLLATE utf8mb4_unicode_ci,
`people_name` text COLLATE utf8mb4_unicode_ci,
`people_url` varchar(255),
`comment_id` int,
`URL` varchar(255),
primary key (`comment_id`)
)
灵感来源:MYSQL中的COLLATE是什么
mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记utf8,永远使用utf8mb4。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。
最后重新创建表,再插入数据,展示以下神奇操作(我把彩虹
扒下来了):
问题三
出现了低级错误:
(1264, "Out of range value for column 'comment_id' at row 1")
显然是我的定义的int类型太小了,改成了bigint(总感觉哪里不对)
ok,目前的问题解决。