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
Colorful
V2EX  ›  Python

关于爬虫这块有个比较好奇的问题,想请教

  •  
  •   Colorful · 2021-05-13 15:02:54 +08:00 · 3334 次点击
    这是一个创建于 1269 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每次爬虫之后,到数据库里面去,那假如说有重复的怎么解决? 是直接在写数据库方法的时候处理?

    先用条件去判断这些数据有没有,有的话,更新?没有就插入?这样解决?

    还是在页面显示的时候解决?用关键的字段去判断,然后去重,再显示最近的一条?

    爬虫菜鸟一枚

    22 条回复    2021-05-26 10:38:34 +08:00
    CainWang
        1
    CainWang  
       2021-05-13 15:10:30 +08:00
    可以把不想要重复的字段在数据库做个唯一索引。
    或者把不想要重复的字段值拼接取一个 hash 放 redis 里,每次抓取入库前做 hash 校验过滤一遍
    lithiumii
        2
    lithiumii  
       2021-05-13 15:15:16 +08:00
    不想重复的字段唯一索引,写入时语句用 upsert ( mongodb )或者 INSERT ... ON DUPLICATE KEY UPDATE ( mysql ) 之类的
    Colorful
        3
    Colorful  
    OP
       2021-05-13 15:29:23 +08:00
    @lithiumii 这个方法,我好好研究一下,太感谢了
    Colorful
        4
    Colorful  
    OP
       2021-05-13 15:29:55 +08:00
    @CainWang redis 不熟,没怎么碰过
    而且用的是阿里最便宜的服务器,估计用几次,就会爆掉吧
    vacuitym
        5
    vacuitym  
       2021-05-13 16:11:29 +08:00
    可以考虑布隆过滤
    Colorful
        6
    Colorful  
    OP
       2021-05-13 16:29:14 +08:00
    @vacuitym 这个知识,感觉不在我的知识范围内,不过我得好好了解下。
    imn1
        7
    imn1  
       2021-05-13 17:07:24 +08:00
    url 一般可以做唯一标识( uniq key ),如果还要考虑时效,加个 datetime 基本够了
    Colorful
        8
    Colorful  
    OP
       2021-05-13 17:22:18 +08:00
    @imn1 如果仅仅只做唯一标识的话,那同样的 URl 是添加不了?可是我想做更新处理
    imn1
        9
    imn1  
       2021-05-13 17:44:45 +08:00
    @Colorful #8
    唯一标识不一定是主键,用几个字段合成一个 uniq index,对 insert/upsert 也是有效的
    QuinceyWu
        10
    QuinceyWu  
       2021-05-13 17:48:56 +08:00
    upset
    Colorful
        11
    Colorful  
    OP
       2021-05-13 17:54:37 +08:00
    @imn1 我得好好了解下,感谢了
    Aleph
        12
    Aleph  
       2021-05-13 20:47:07 +08:00
    数据库设置一个 MD5 字端,插入的时候 insert ingnore into...
    johnsona
        13
    johnsona  
       2021-05-13 20:50:40 +08:00 via iPhone
    这都不会?不会吧不会吧方法多了去了 数据库 insert ignore 应用代码去重 至于你说的页面去重,我在下一页重复你不傻眼?
    dorothyREN
        14
    dorothyREN  
       2021-05-13 23:21:07 +08:00
    唯一索引 然后忽略异常
    no1xsyzy
        15
    no1xsyzy  
       2021-05-14 09:41:47 +08:00
    这跟爬虫有什么关系?
    这不是数据库的一般使用吗?
    acmore
        16
    acmore  
       2021-05-14 09:48:00 +08:00
    爬虫常用过滤方法是用布隆过滤器扫 URL
    Codewj
        17
    Codewj  
       2021-05-14 15:50:12 +08:00
    https://onejane.github.io/2021/04/09/%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80%E7%AF%87%E4%B9%8BScrapy%E6%8A%93%E5%8F%96%E4%BA%AC%E4%B8%9C/#%E4%BF%9D%E5%AD%98%E5%88%86%E7%B1%BB%E6%95%B0%E6%8D%AE
    scrapy_redis 现成的组件直接套用即可,配置几行代码就行了,本质就是使用 redis 对 url 生成的指纹通过中间件进行去重实现
    Colorful
        18
    Colorful  
    OP
       2021-05-14 17:20:11 +08:00
    @no1xsyzy 那是我搞错了
    evil0harry
        19
    evil0harry  
       2021-05-14 17:32:27 +08:00
    布隆过滤器
    aozhou
        20
    aozhou  
       2021-05-14 18:23:48 +08:00
    没到一定数量级不需要布隆过滤器吧,就按你说的第一种方案也可以,只是单纯设置索引的话,如果频率够高,到时候自增 id 会很大,也挺蛋疼,还有一堆“Duplicate”日志。
    不到千万级别的数据量的话,就是唯一索引和你说的第一种办法,插入前查询来判断是否插入新数据。
    llsquaer
        21
    llsquaer  
       2021-05-21 10:25:54 +08:00
    量不是很大..直接用 数据库的 insert ignore into table_name(xxxx) .....前提是,字段需要是第一主键
    Colorful
        22
    Colorful  
    OP
       2021-05-26 10:38:34 +08:00
    @llsquaer 至少几千条吧,最多的时候几万条..
    感觉好像不大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1100 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:30 · PVG 03:30 · LAX 12:30 · JFK 15:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.