scrapy豆瓣爬虫mysql存储名字有图片的问题(关于utf8mb4)

若干知识点

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,目前的问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值