V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mon3
V2EX  ›  Python

爬虫, mysql 唯一索引 重复数据 ID 会自增。请问怎么解决?

  •  
  •   mon3 · 2018-12-26 14:52:26 +08:00 · 5274 次点击
    这是一个创建于 2157 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了一下 scrapy 没这问题。
    第 1 条附言  ·  2018-12-26 15:38:47 +08:00
    mysql MD5 字段唯一索引,新增数据重复了,导致 ID 也自动增长了。

    怎么解决新增数据重复 ID 不自增?》
    41 条回复    2019-01-14 13:06:24 +08:00
    holajamc
        1
    holajamc  
       2018-12-26 14:59:25 +08:00
    虽然我不懂你说了什么,但是 INSERT 数据难道 ID 不应该自增?
    bestie
        2
    bestie  
       2018-12-26 15:03:51 +08:00
    不懂你说了什么,插了数据当然会自增,不知道你是怎么判断重复的,重复的跳过就是了
    Vegetable
        3
    Vegetable  
       2018-12-26 15:28:57 +08:00
    我猜是说,判断重复的数据后并灭有插入,但是 ID 却消耗掉了.可能和 on duplicate key update 的问题类似吧.
    xkeyideal
        4
    xkeyideal  
       2018-12-26 15:37:41 +08:00
    难道爬虫都不过滤重复数据了么,布隆过滤器了解一下
    mon3
        5
    mon3  
    OP
       2018-12-26 15:41:59 +08:00
    @xkeyideal 过滤不了,也没用。只能在数据库上设置唯一索引。
    gouchaoer2
        6
    gouchaoer2  
       2018-12-26 15:43:13 +08:00
    用框架就意味着你失去灵活性,就这么简单的任务都无法搞定,所以少用框架
    lihongjie0209
        7
    lihongjie0209  
       2018-12-26 15:43:49 +08:00
    @mon3 你数据能设置唯一索引, 你代码过滤不了? 数据库不是代码??
    loveCoding
        8
    loveCoding  
       2018-12-26 15:52:09 +08:00
    这是业务问题,跟框架没什么关系
    Mac
        9
    Mac  
       2018-12-26 15:55:39 +08:00
    你该去好好看看 INSERT 语句 ON DUPLICATE 时的用法了。
    EvilCult
        10
    EvilCult  
       2018-12-26 15:58:11 +08:00
    同意 3 楼....
    是不是写入的时候用的是“ replace into ”
    而不是 “ on duplicate key update ”
    xpresslink
        11
    xpresslink  
       2018-12-26 16:21:11 +08:00
    以前用过 scrapy+django+djangoitem 爬到内容直接用 django ORM 入库,每条信息都会有一个唯一索引用识别,
    再爬的时候 Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'})
    glacer
        12
    glacer  
       2018-12-26 16:35:23 +08:00
    @EvilCult on duplicate key update 也会导致原 id 变化的
    aborigine
        13
    aborigine  
       2018-12-26 16:40:04 +08:00
    @EvilCult #10 无论 replace into 还是 on duplicate key 都会导致 id+1
    xpresslink
        14
    xpresslink  
       2018-12-26 16:45:21 +08:00
    @xpresslink #11,写错了应该是用 .objects.update_or_create,没有就新建,有就更新。
    mon3
        15
    mon3  
    OP
       2018-12-26 16:50:55 +08:00
    @Mac ON DUPLICATE ID 一样会自增。
    mon3
        16
    mon3  
    OP
       2018-12-26 16:52:42 +08:00
    @xpresslink 表的数据有的不能更新的,所以这个办法不太适合我。。
    xpresslink
        17
    xpresslink  
       2018-12-26 16:57:23 +08:00
    @mon3
    字段唯一索引,新增数据重复了,然后 你的处理逻辑是什么?直接丢弃 /新建一个 /更新?
    请说出你的故事。
    mon3
        18
    mon3  
    OP
       2018-12-26 17:02:25 +08:00
    @xpresslink 有重复数据的话直接丢弃,这步 mysql 自动执行了,但是 ID 也会增长,我需要的是 ID 不增长,数据直接丢。
    holajamc
        19
    holajamc  
       2018-12-26 17:03:22 +08:00
    @mon3 既然这样的需求,为什么不考虑用布隆过滤器进行过滤呢…
    mon3
        20
    mon3  
    OP
       2018-12-26 17:09:33 +08:00
    @holajamc 主要数据太多上亿,采集无法 24 小时开。
    realpg
        21
    realpg  
       2018-12-26 17:10:31 +08:00
    innodb 不重复都会出现跳 ID 事务机制导致的
    xpresslink
        22
    xpresslink  
       2018-12-26 17:10:36 +08:00
    @mon3

    alter table tablename drop column id;
    alter table tablename add id mediumint(8) not null primary key auto_increment first;
    xpresslink
        23
    xpresslink  
       2018-12-26 17:11:32 +08:00
    我觉得没有必要执念于此。
    holajamc
        24
    holajamc  
       2018-12-26 17:12:49 +08:00
    @mon3 采集完全没有必要 24 小时工作呀,而且上亿的数据布隆过滤器足够应付…
    gaius
        25
    gaius  
       2018-12-26 17:22:18 +08:00
    是自增主键跳了吗,正常,多线程插入就会跳。
    fyxtc
        26
    fyxtc  
       2018-12-26 17:22:37 +08:00
    gouchaoer2
        27
    gouchaoer2  
       2018-12-26 17:57:41 +08:00
    @fyxtc ???!!!
    tingfang
        28
    tingfang  
       2018-12-26 18:02:01 +08:00
    on duplicate key update 重复是会跳号的。
    EvilCult
        29
    EvilCult  
       2018-12-26 18:39:19 +08:00
    @glacer
    @aborigine
    我读书少你们两个不要骗我, 我要是没记错的话:
    设置 UNIQUE 索引后(比如 A)
    执行 INSERT INTO `TABLE` (A,B) VALUES (123,456) ON DUPLICATE KEY UPDATE B = 456;
    这是更新旧有行的吧~~
    rocketman13
        30
    rocketman13  
       2018-12-26 18:48:03 +08:00
    看 mysql 日志就可以了,应该是先写入,再删除
    chinvo
        31
    chinvo  
       2018-12-26 18:55:08 +08:00
    自己实现 UPDATE OR INSERT 啦

    如果你用 orm,一般 orm 会提供的

    没提供的话也就是查询两次的事,一次查 ID 是否存在,一次插入 /更新数据
    mon3
        32
    mon3  
    OP
       2018-12-26 19:19:38 +08:00
    @chinvo 哪个 ORM 可以实现?
    chinvo
        33
    chinvo  
       2018-12-26 19:20:38 +08:00
    @mon3 我用 sqlalchemy,没仔细研究,应该是没有的,所以我查两次
    ooh
        34
    ooh  
       2018-12-26 19:46:59 +08:00
    lz 是发现主键 ID 不连续吧,MySQL InnoDB 插入数据是先自增主键 ID,然后再写入数据,因为你有唯一键,所以重复的时候插入失败,但是主键 ID 已经自增了,如果你没办法保证插入不重复的数据,那么把 InnoDB 换成 MyISAM 即可
    aborigine
        35
    aborigine  
       2018-12-26 19:51:18 +08:00
    @EvilCult 你去试试就知道了
    Mac
        36
    Mac  
       2018-12-26 19:55:36 +08:00 via Android
    @mon3 哦,我理解题目错了,我以为是出现重复记录。原来是自增跳号。innodb 就是这样的,myisam 没有这个问题。
    EvilCult
        37
    EvilCult  
       2018-12-26 20:27:03 +08:00 via iPhone
    @aborigine 等下,看了 34 楼,我发现我好像看错题了…………囧…………
    你们说的是 on duplicate update 后再查数据自增 ID 不连续吧…………[手动捂脸]
    chengxiao
        38
    chengxiao  
       2018-12-26 20:45:19 +08:00
    加一层 redis set 去重啊 入库前先判断 set 里有没有 有了 pass 没有了 set+1 入库
    另外你不要爬一条插一条啊 肯定是到最后一起提交的
    Nick2VIPUser
        39
    Nick2VIPUser  
       2018-12-26 23:51:34 +08:00
    很早遇到这个问题,不过我觉得这不算问题,id 只是一个唯一标识而已,跳号其实没有影响;
    如果可以的话,在数据爬完之后另外找一个库重新写入一遍也是可以的。
    pan404
        40
    pan404  
       2018-12-27 09:57:11 +08:00
    你是想说数据重复了没清洗掉吧
    qaz564172564
        41
    qaz564172564  
       2019-01-14 13:06:24 +08:00
    去重啊,偷懒的话 url 设为主键不久 ok 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:42 · PVG 20:42 · LAX 04:42 · JFK 07:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.