数据采集系统的通用设计思路
这期视频来分享下目前阶段我对于一个爬虫系统设计的思考,希望给大家一定启发。
场景
设计思路
数据库怎么设计
场景
首先总结系数据采集的大致场景,当然之前有专门视频讲过爬虫可以做什么,建议大家先去看看那个,这里的是取出大致几个实用的价值高,一般企业场景更大可能会用到的。
目前的爬虫系统的数据采集我觉得无非以下几种场景:
采集文章:比如公众号、新闻网站、博客网站、私域文章。目的是用来训练模型或者备份。
采集图片,视频。视频为了备份和学习,图片可以制作一个壁纸网站,相当于是资源的转运,比如一些文库,一些ppt,字体等。
采集评论、弹幕、用户群体粉丝。目的是用于营销需求,或者是一些学生的课设。
思路
我觉得做一个系统的话就是要拆分项目,细化任务,将一个大项目分成很多的流程,层级,抽出一些公共的函数等。
当然我们这里说的分层是基于宏观的整个项目的,而不是在说scrapy采集时候的调用回调函数的一层一层的。
我们这里举个例子,假如现在有一个博客网站需要你采集,你会怎么做呢?
最简单的写个循环requests请求,进阶点的相比自己写个框架支持多线程等不如使用现成的框架scrapy。然后第一层爬虫,你可以采集网站的作者,第二层爬虫,采集每个作者的主页的文章,第三层爬虫,采集文章的主页。
主要的爬虫就上面三个,配合上各种自己积累的通用的中间件和工具函数,这个系统就可以很好的运行了。当然你也可以再写一些函数,用于补充一些特殊类型特殊来源的数据。比如说你的第一层爬虫采集作者,你肯定很难从一个地方获取到所有的作者。你可能会去每个人的粉丝列表采集用户id入库。但也有别的地方可以获取到用户比如说博客页面的评论,用户榜单等地方。
但是我主要想表达的思想是分层采集数据,这样做的目的就是让细节更可控。而不是说一个scrapy爬虫直接从头爬到尾,这样你在后续想要实现全站采集或者增量采集的时候就会比较有压力,应接不暇。
所以在上面的采集博客系统的分层思路之后,很多网站都可以以此类推。
比如说一个图片网站:
- 第一层:从网站首页,分类页,关键词检索页,标签页提取图片详情页链接入库
- 第二层:从图片详情页提取高清图片链接,图片标签。然后你又可以将提取到的标签添加到第一层的关键词检索页的表中,然后你可以设置下采集哪些链接。(如果必要的话,你可以备份整个网页到数据库或者本地文件以供后续解析其他信息。如果你还想做一丢丢小小的优化的话,你还可以在存储页面源代码之前清理下页面没用的标签比如css,js,svg等)
- 第三层:根据高清图片链接下载图片。当然,如果你想的话,就是不想采集所有照片,只是下载你喜欢的图片的话,你可以在第三层前面加一步给图片打标签,自己做个管理界面打标签。
数据库设计
我觉得数据库设计是非常重要的,一个设计不好可能就要返工重新再来,再涉及到迁移处理数据的话,很头大的。尤其是新手会遇到这个问题。因为你连数据库都设计不好的话,就说明你对于要存储的数据字段没有清晰的认知。所以我觉得就是做之前要好好观察下将要采集的网站,想想要有哪些层级,存储哪些字段。
不过一般的网站层级都是很很清晰的。
我们这里以我们上面说的图片网站为例设计一下数据库。这个网站我们假设他有一个标签列表页面。然后每个标签都有图片列表页面,然后图片详情页面。
- image_tag
- name
- image_tag_detail
- tag_id
- detail_id
- image_detail
- url
- hd_url
- crawled(时间戳)
- image_html
- html
- parsed(时间戳)
第一层:采集所有标签
第二层:采集标签对应的图片列表页面
(筛选图片)
第三层:采集图片详情页
(解析图片信息:标签、高清地址)
第四层:采集高清图片
只讲概念可能会有点抽象,但是后续可能会做一个网站,再做出采集此网站的代码供大家学习参考。