爬虫编程逻辑问题请教

202 天前
 seekafter

有个编程问题,我在爬取一个相册专辑. 里面目前有 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 | 是否结束

请问还有更好的办法不

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

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

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

所以这是要干嘛?尝试把一个分层的爬虫精简到一张表?
seekafter
202 天前
@ntedshen 就是爬取一个图片专辑.先取完列表再下东西确实也行,感谢
summerLast
202 天前
对每个 url 算出一个 md5, 然后 url 对应 md5 变了就重新抓取?
seekafter
201 天前
@summerLast 爬取时需要先获取专辑 url 里面的数据才能去下载图片,专辑的 url 是固定不变的,所以没办法计算 md5 去重
summerLast
201 天前
@seekafter url 对应的资源算出一个 md5

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1045036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX