爬虫优化

2018-05-07  本文已影响0人  Fathui

内存

pymysql浮动游标获取入口数据,防止一次性加载过量数据至内存,此时不做去重,使用set,hash,md5, 布隆过滤器等进行去重处理,分布式使用redis

class PublicMysqlByIter:
    """mysql_by_iter"""

    def __init__(self, connect_data):
        self.conn = pymysql.connect(**connect_data)
        self.cursor = self.conn.cursor(pymysql.cursors.SSCursor)

注意浮动游标在同一时间只能处理一个事件,如果使用浮动游标做查询,又需要做插入的话,需要使用其他的cursor

去重

安装redisbloom插件,可直接使用redis自带的布隆过滤器,效率比自己写的布隆过滤器高很多,内网状态,推送2万条数据4秒左右,参考(https://github.com/RedisBloom/redisbloom-py)或者直接使用execute_command

result = rds.execute_command("bf.add", boom_filter_key, dup_data)
if int(result) == 0:
    logger.info('这条数据重复了~')
    continue

从千万级mysql表中取数作为采集入口效率过低问题

设置节点(自增id),每次取少量(比如5-10万条), 采集完后保存节点, 每1-5分钟启动一次,可借助redis做队列

脚本拓展性

设置固定的大框架, 划分为入口、采集、保存等子节点,每次修改只许修改对应子节点即可

上一篇 下一篇

猜你喜欢

热点阅读