zoukankan      html  css  js  c++  java
  • 论Python爬虫与MySQL数据库交互的坑

    1.爬虫和关系数据库的交互次数能减少就减少。

    之前由于爬虫出了bug,导致错误日志持续膨胀耗尽服务器空间,导致MySQL数据库无法添加数据,于是乎想把爬虫中间过程的所有数据(图片url等待队列)放进数据库。爬虫的爬取速度明显下降,并且数据库操作过程出错(经常发生事务锁定时间过长强退这种情况)。之前也有想到连接次数时间过长这种情况,把数据库操作能合并的合并了,删除和添加都是批量操作。结果只解决了爬取时间过长的问题,事务锁定过久的问题还有。

          之后改回使用文件储存图片url队列(定时清除文件),速度回到了以前的水平,并且MySQL的事务问题不再出现。

          MySQL数据库类型是innoDB,而innoDB对每条语句都包装成事务,没有索引的情况下还会使用表锁,严重影响并发量和每次操作的锁定时间。

          解决方法有以下几个∶

          0.不要过于依赖MySQL数据库,实在需要搭分布式调度队列,最好使用redis或者rabbitMQ之类的中间件。redis没有硬性的事务锁定,只有SETNX命令显式指定悲观锁。爬虫的业务一般只用到查询、删除和添加这三种,更新很少用,悲观锁可以不用。

            1.使用mongoDB这种非关系型数据库,或者使用MyISAM的MySQL数据库。非关系型的mongoDB数据库对高并发输入友好,并且同样支持索引和结构化查找。这点就非常适合爬虫数据存储。

            2.做好数据索引。程序每天都要做过期数据删除操作,可以根据数据的过期时间做个索引,每次操作可以排除某个时间点之前的数据

  • 相关阅读:
    7-4
    7-3
    第五章例5-2
    第五章例5-1
    第四章例4-12
    第四章例4-11
    第四章例4-10
    第四章例4-9
    第四章例4-8
    第四章例4-7
  • 原文地址:https://www.cnblogs.com/dgutfly/p/12806143.html
Copyright © 2011-2022 走看看