论Python爬虫与MySQL数据库交互的坑
Posted DGUT_FLY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论Python爬虫与MySQL数据库交互的坑相关的知识,希望对你有一定的参考价值。
1.爬虫和关系数据库的交互次数能减少就减少。
之前由于爬虫出了bug,导致错误日志持续膨胀耗尽服务器空间,导致MySQL数据库无法添加数据,于是乎想把爬虫中间过程的所有数据(图片url等待队列)放进数据库。爬虫的爬取速度明显下降,并且数据库操作过程出错(经常发生事务锁定时间过长强退这种情况)。之前也有想到连接次数时间过长这种情况,把数据库操作能合并的合并了,删除和添加都是批量操作。结果只解决了爬取时间过长的问题,事务锁定过久的问题还有。
之后改回使用文件储存图片url队列(定时清除文件),速度回到了以前的水平,并且MySQL的事务问题不再出现。
MySQL数据库类型是innoDB,而innoDB对每条语句都包装成事务,没有索引的情况下还会使用表锁,严重影响并发量和每次操作的锁定时间。
解决方法有以下几个∶
0.不要过于依赖MySQL数据库,实在需要搭分布式调度队列,最好使用redis或者rabbitMQ之类的中间件。redis没有硬性的事务锁定,只有SETNX命令显式指定悲观锁。爬虫的业务一般只用到查询、删除和添加这三种,更新很少用,悲观锁可以不用。
1.使用mongoDB这种非关系型数据库,或者使用MyISAM的MySQL数据库。非关系型的mongoDB数据库对高并发输入友好,并且同样支持索引和结构化查找。这点就非常适合爬虫数据存储。
2.做好数据索引。程序每天都要做过期数据删除操作,可以根据数据的过期时间做个索引,每次操作可以排除某个时间点之前的数据
以上是关于论Python爬虫与MySQL数据库交互的坑的主要内容,如果未能解决你的问题,请参考以下文章