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 · 36 天前 · 1788 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    爬虫菜鸟一枚

    22 条回复    2021-05-26 10:38:34 +08:00
    CainWang
        1
    CainWang   36 天前
    可以把不想要重复的字段在数据库做个唯一索引。
    或者把不想要重复的字段值拼接取一个 hash 放 redis 里,每次抓取入库前做 hash 校验过滤一遍
    lithiumii
        2
    lithiumii   36 天前
    不想重复的字段唯一索引,写入时语句用 upsert ( mongodb )或者 INSERT ... ON DUPLICATE KEY UPDATE ( mysql ) 之类的
    Colorful
        3
    Colorful   36 天前
    @lithiumii 这个方法,我好好研究一下,太感谢了
    Colorful
        4
    Colorful   36 天前
    @CainWang redis 不熟,没怎么碰过
    而且用的是阿里最便宜的服务器,估计用几次,就会爆掉吧
    vacuitym
        5
    vacuitym   36 天前
    可以考虑布隆过滤
    Colorful
        6
    Colorful   36 天前
    @vacuitym 这个知识,感觉不在我的知识范围内,不过我得好好了解下。
    imn1
        7
    imn1   36 天前
    url 一般可以做唯一标识( uniq key ),如果还要考虑时效,加个 datetime 基本够了
    Colorful
        8
    Colorful   36 天前
    @imn1 如果仅仅只做唯一标识的话,那同样的 URl 是添加不了?可是我想做更新处理
    imn1
        9
    imn1   36 天前
    @Colorful #8
    唯一标识不一定是主键,用几个字段合成一个 uniq index,对 insert/upsert 也是有效的
    QuinceyWu
        10
    QuinceyWu   36 天前
    upset
    Colorful
        11
    Colorful   36 天前
    @imn1 我得好好了解下,感谢了
    Aleph
        12
    Aleph   36 天前
    数据库设置一个 MD5 字端,插入的时候 insert ingnore into...
    johnsona
        13
    johnsona   36 天前 via iPhone
    这都不会?不会吧不会吧方法多了去了 数据库 insert ignore 应用代码去重 至于你说的页面去重,我在下一页重复你不傻眼?
    dorothyREN
        14
    dorothyREN   36 天前
    唯一索引 然后忽略异常
    no1xsyzy
        15
    no1xsyzy   35 天前
    这跟爬虫有什么关系?
    这不是数据库的一般使用吗?
    acmore
        16
    acmore   35 天前
    爬虫常用过滤方法是用布隆过滤器扫 URL
    Codewj
        17
    Codewj   35 天前
    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   35 天前
    @no1xsyzy 那是我搞错了
    evil0harry
        19
    evil0harry   35 天前
    布隆过滤器
    aozhou
        20
    aozhou   35 天前
    没到一定数量级不需要布隆过滤器吧,就按你说的第一种方案也可以,只是单纯设置索引的话,如果频率够高,到时候自增 id 会很大,也挺蛋疼,还有一堆“Duplicate”日志。
    不到千万级别的数据量的话,就是唯一索引和你说的第一种办法,插入前查询来判断是否插入新数据。
    llsquaer
        21
    llsquaer   28 天前
    量不是很大..直接用 数据库的 insert ignore into table_name(xxxx) .....前提是,字段需要是第一主键
    Colorful
        22
    Colorful   23 天前
    @llsquaer 至少几千条吧,最多的时候几万条..
    感觉好像不大
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1041 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:33 · PVG 07:33 · LAX 16:33 · JFK 19:33
    ♥ Do have faith in what you're doing.