V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seekafter
V2EX  ›  程序员

爬虫编程逻辑问题请教

  •  
  •   seekafter · 188 天前 · 1610 次点击
    这是一个创建于 188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有个编程问题,我在爬取一个相册专辑. 里面目前有 100 张图片,图片 id 从 100 到 1,最近的 id 为 100,最旧的 id 为 1 相册内容会变动,图片 id 会增加到 110,120 等等 每次爬取可能只爬取了 10 张(比如从 id100 爬取到了 id90) 现在是把爬取过的图片 id 入库了,每次下载前查询下是否爬过 我该怎么记录能不少爬取数据?相册更新了该怎么处理?

    我想到的是这样解决的: 1.当专辑第一次运行时,记录初始图片 id(100)和当前图片 id,同时标记专辑未爬完(是否结束为否) 2. 爬数据...每次结束时更新当前图片 id 为当前的 id ,意思下次从这里开始 3. 第二次运行时,如果是否结束为否,就从第二步中的当前图片 id 开始向后爬,直到把是否结束变成是 4. 如果结束了,从头开始爬,爬取时再更新当前图片 id 字段 5.当前图片 id = 初始图片 id 时,把初始图片 id 更新成最新的,专辑结束

    关键就是是否结束这个字段了,为否时爬取旧数据,当旧数据爬完时反过来爬新数据 后续再运行就都是爬新数据了

    表结构: 相册 id | 初始图片 id | 当前图片 id | 是否结束

    请问还有更好的办法不

    13 条回复    2024-05-31 10:57:34 +08:00
    NoOneNoBody
        1
    NoOneNoBody  
       188 天前
    网页即使变化,图片的 url ,截止到文件名部分应该是不变的
    milukun
        2
    milukun  
       188 天前
    如果你用 scrapy 框架抓取的话,这个是可以设置自动记录任务进度的,任意时间中断、开启均可以断点继续。
    如果没有用框架的话,你抓取过的链接或者找到唯一识别的 ID 记录下来,去重就好了。抓过的就不再打开详情页继续了
    ZnductR0MjHvjRQ3
        3
    ZnductR0MjHvjRQ3  
       188 天前
    你要不给图片保存的时候直接保存成 id.jpg 这种 下次直接读本地最新的一张图片的文件名就知道我最新一次爬取到哪里了

    或者你每次爬取都记录一下 id 库里初始 id 为 0 ,0 然后写入每次爬取的 id 判断是否大于最大值或者小于最小值 如果是的话就更新 这样你可以拿到一个爬取区间,然后剩下的就是匹配是否处于爬取区间了

    再或者就给每个文件生成一个文件 md5 ?或者哈希?文件不变这个值就不会变 每次对比?感觉这个方法有点过于笨重
    SenLief
        4
    SenLief  
       188 天前
    看这意思图片的 url 应该是变动的,url 中含有 id 的话,直接保存一下已下载的 id ,然后更新就可以了吧。
    F7TsdQL45E0jmoiG
        5
    F7TsdQL45E0jmoiG  
       188 天前
    为啥不从 1 开始爬
    seekafter
        6
    seekafter  
    OP
       188 天前
    @milukun 是自己写的,只能记录 id 去重了
    seekafter
        7
    seekafter  
    OP
       188 天前
    @Motorola3 他的 id 并不是顺序的,现在就是记录 id 到数据库,爬取时查询下是否爬过了
    seekafter
        8
    seekafter  
    OP
       188 天前
    @morenacl 爬取图片的接口没找到倒叙排序的方法,只能从 100->1
    ntedshen
        9
    ntedshen  
       188 天前
    这不易恒泰的 artistcg 区特色操作么,更新都倒着摆。。。
    一般是先取完列表再下东西,倒不倒其实也就没啥影响。。。

    所以这是要干嘛?尝试把一个分层的爬虫精简到一张表?
    seekafter
        10
    seekafter  
    OP
       187 天前
    @ntedshen 就是爬取一个图片专辑.先取完列表再下东西确实也行,感谢
    summerLast
        11
    summerLast  
       187 天前   ❤️ 1
    对每个 url 算出一个 md5, 然后 url 对应 md5 变了就重新抓取?
    seekafter
        12
    seekafter  
    OP
       187 天前
    @summerLast 爬取时需要先获取专辑 url 里面的数据才能去下载图片,专辑的 url 是固定不变的,所以没办法计算 md5 去重
    summerLast
        13
    summerLast  
       186 天前
    @seekafter url 对应的资源算出一个 md5
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:01 · PVG 07:01 · LAX 15:01 · JFK 18:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.