我对于爬虫项目的阶段性总结。
包含做项目时的流程、每个流程相关技术概述以及自己的学习经验。
方便自己后期查阅,也希望能给别人一点点指引。
【前言】
- 本学习计划仅作为参考,具体学习路线根据自己的实际情况酌情调整。
- 本学习路线图侧重数据工程师或者数据科学家路线,包括数据爬虫,清洗,存储,分析,展示等一系列流程。
- 本文档主要是给大黄写的,大黄写代码要加油啊!
完整的项目流程
- 确定项目内容:可以选择自己感兴趣的内容或者根据工作任务确定。
- 确定项目最终效果:根据目标效果反推出需要的数据。
- 确定数据源:根据想要的数据确定一个或者多个数据源
- 确定技术方案:分析数据源,确定需要的技术方案以及技术可行性。
- 开始动手!按照技术方案将数据进行采集,并最终实现预期的项目效果。
项目详细技术
网页数据获取
本部分工作主要是用爬虫程序模拟浏览器访问对应的网站来获取网页html数据。
- 发送请求获取网页数据。以python为例,可以通过类似于requests、urllib等package发送请求。
- 在正式编写代码前,要首先通过F12开发者选项(chrome浏览器)分析请求内容。或者直接通过网站页面右键->检查->network面板进行查看。
- 分析请求的url,查看是否存在跳转,是否需要登陆,如果需要登陆则考虑模拟登陆或者保存cookie或者使用cookie池。
- 查看能否直接请求对应的api获取目标数据,如果不能,再考虑请求网页原始数据再将目标数据解析出来。
- 对于模拟登陆,可以通过输入一个错误的用户名和密码来获得真正的url请求情况,否则可能因为成功跳转而看不到相关内容;
- 注意各种反爬虫措施的处理,包括伪造请求头、设置请求间隔时间、设置ip代理,携带cookie信息等等
网页解析
本部分工作是将网页对应的html页面内容进行解析。重点是灵活使用各种解析库,将想要的数据提取出来。
其中解析库主要包括xpath,bs4,pyquery等,还可以结合正则表达式、字符串操作等多种方式对网页内容进行解析。
数据处理
网页解析出来的内容数据可能存在数据缺失、数据格式不一致等问题。所以需要进行数据处理操作。
- 数据缺失问题:删除整条数据、填充特殊值、填充中位数、填充众数、数据拟合等
- 数据格式不一致问题:确定数据统一格式,包括单位、格式等
数据存储
将处理好的数据进行数据存储,方便后期使用。
- 关系型数据库:mysql、oracle等
- 文档型数据库:mongodb
- 图数据库:neo4j
- 内存数据库: redis
个人比较倾向于爬虫处理后的结果暂时放到mongdb中,原因就是方便读写。等数据处理结束之后可以根据数据类型以及对外服务的类型决定放到图数据库或者关系型数据库。
数据分析
根据预期的项目效果对已经爬取的数据进行数据分析。
- 按照不同类别进行划分,比如不同的地域,不同季节,不同人群等。
- 按照时间线进行分析,比如平均身高,平均薪酬等。
- 按照其他统计学的知识对数据进行处理并分析。
数据展示
数据分析的结果要通过合适的方式进行展示。
- ppt、word等办公软件。考虑内嵌图表或者截图插入
- 个人网站、个人博客等。考虑使用echarts.js或者d3.js等图表库,效果非常好。
结论
我们研究或者调研的内容告诉我们什么内容,说明了什么道理,给我们什么启示,这个也应该作为我们整个项目的一部分进行说明。
技术进一步提升
上面介绍的技术仅仅适应于数据量较小的常规数据采集路线。下面说一下其中可以进行扩展和提升的部分。
爬虫框架的使用
数据采集是一个比较常见的需求,所以程序员们开发出了很多方便扩展的爬虫框架,比如scrapy、pyspider、scrapy-redis、scrapy-cluster等,可以让我们将重点放在处理核心业务上。
docker的使用
docker可以认为是一个轻量的虚拟机,通过镜像来创建实例,每个实例彼此隔离彼此独立,从而可以让程序员摆脱编程开发测试部署环境不一致的问题,同时方便进行横向扩展。在我们项目构造出对应的镜像之后,便会由镜像在手,天下我有的豪气。
在使用新的组件之前,可以先去dockerhub看看,之后尽量所有的项目要通过docker进行部署,用dockerfile来进行定义。让项目组件化,这样就可以解耦合,从而方便扩展和升级。
爬虫过程的每一个步骤都可以单独拿出来交给对应的docker镜像来处理。看自己最后的需求进行不同粒度的分解。
大数据组件
在数据清洗、数据分析的时候如果数据量太大,可以和大数据平台进行对接,包括hadoop、mapreduce等,然后将对应的结果保存起来供进一步使用。
大数据平台的东西由很多,而且环境部署比较麻烦,所以本部分强烈建议使用docker进行部署,然后在部署的时候要注意不同实例之间的通信。
分布式爬虫部署
当数据量太大,单机爬虫的速率就远远不能满足我们的需求,这个时候就可以考虑使用分布式爬虫,将很多台主机一起来爬取想要的数据,上面说的爬虫框架sacrpy就是单机版本的,scrapy-redis就是在scrapy的基础上添加redis用来做爬取队列,可以作为分布式爬虫使用,scrapy-cluster是在scrapy-redis的基础上添加大数据组件kafka从而与大数据平台对接,也属于分布式爬虫。scrapyd可以用来方便的部署分布式爬虫程序。Gerapy也值得关注。
APP内容的爬取
本部分我没有做过,但是我知道有很多库,包括Charles、mitmproxy、Appium等,可以对手机app进行抓包,从而采集到想要的数据。
学习经验
- 要以项目为主导,no bb,show your code!!
- 善于使用搜索引擎google、bing
- 学会使用stackoverflow查找bug
- 尽量通过官方文档学习新的技术
- 合理使用github这个宝库
- 找一本好的参考资料比如Python 3网络爬虫开发实战以及网站静觅-崔庆才
最后,开始动手吧!!!!