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