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.做好数据索引。程序每天都要做过期数据删除操作,可以根据数据的过期时间做个索引,每次操作可以排除某个时间点之前的数据

  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/dgutfly/p/12806143.html
Copyright © 2011-2022 走看看