如果你不知道做什么,那就学一门杂学吧

简介: 如果你不知道做什么,那就学一门杂学吧

序言

这篇文章没有代码,请放心阅读。

多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和S君相见的那个遥远的下午。那时的B公司,还是一个仅有6个人的小团队,Mac和显示器在桌上依次排开,大家坐在一起,不需要称呼姓名,转过脸去,对方就知道你在和他说话。一切看起来都那么美好,我们所有人,都希望自己和这个公司能够一起成长。

彼时S君刚从加拿大回来,老板把他介绍给我们,于是S君作为数据产品经理跟我有了项目上的接触。

创业公司里面,每一个人都需要会很多的技艺,于是S君开始自学Python。

有一天,S君问我:“你玩MineCraft吗?“

“玩,但我更喜欢在B站上看别人的世界。”我答道。

“我觉得我现在写程序,像是在玩我的世界。”S君笑着说道。

“是不是觉得你已经掌握了Python的基本语法,看着别人把Python用的溜溜转,而你自己却不知道用它来做什么?”

“是这样的,你懂我。”

“那你学一门杂学吧。”

于是S君被我诱拐过来跟我一起写爬虫。

后来,S君离开了B公司。

三个月后,我也离开了。

从此,我们再也没有见过。

写爬虫与三峡大坝

有一天,S君兴冲冲地跑来跟我说:“我体会到三峡大坝的伟大功能了!”

“你是爬虫工程师还是水利工程师?”

“你知道吗,不管上游的水势多么凶猛,从大坝出来以后总是安全而稳定。”S君并没有回答我的问题,而是自顾自地说道。

“原来你开始用Kafka。不错,孺子可教。”

S君吐了一下舌头:“还是师傅教导有方。”

前不久,S君的爬虫刚刚达到了日产数据千万条的目标。然而他只高兴了一天。因为他发现,数据写到数据库以后,读起来很麻烦。

S君有多个数据分析的系统需要从数据库里面读取爬虫爬好的数据,但是从每天千万量级的数据中寻找特定的数据是一个很慢的过程。如果程序遇到异常导致崩溃,又得从头开始读。

S君问我:“现在我每一个数据分析的脚本都要从数据库里面读一次数据,做了太多重复的工作,单机单节点的数据库快要撑不住了。我是不是要去学习分库分表搭建集群啊?”

我告诉S君:“这个后面你自然是需要去做的。但现在,你可以先试一试Kafka,我已经搭建好了一个Kafka的集群了,你这样使用……”。

后来,S君让所有爬虫把爬到的数据到直接送进了Kafka,然后再从Kafka里面读数据出来,一个Group用来备份原始数据,一份Group用来生成中间表,一份Group用来监控报警,一份Group用来绘制DashBoard。无论爬虫塞给Kafka的数据有多少,有多快,从Kafka读数据的地方都能按照自己的节奏来消费和使用。

编程最重要的能力是变通

S君是一个老实孩子。

在开发一个爬虫的过程中,网站接口返回给他的数据看起来是JSON格式,于是他就用Python自带的JSON库去解析。结果解析失败了。因为这些所谓的看起来像JSON的东西,竟然没有双引号。

难道是JSON的超集?S君一通搜索,发现用YMAL库也许可以解析这种数据。于是安装YMAL库,一解析又报错。

难道这些数据直接就是Python的字典?于是S君用上了邪恶的eval。又报错,因为里面有null和小写的true。

“你为什么不试一试直接用正则表达式呢?”我对S君说。

“靠!”S君一拍桌子,旁边的老板吓得把搪瓷杯子里面的快乐水洒在了白衬衣上。

然后S君用正则表达式花了10秒钟结束了战斗。

既然收集了数据就要让它发光发热

S君在加拿大留学时学的专业是金融数学和统计。所以他对数据分析也很有兴趣。在他爬虫收集的数据够用以后,我跟他讲了如何使用Pandas来分析数据。

S君把他分析的酒店价格变化数据给分享给了我们。不愧是金融+数学+统计学背景的高级知识分子 + 超级强大的Pandas + 超级好用的Jupyter。这份数据不仅完美再现了过去一年的价格走势,还预测了未来的任何变化,多达四十六张图表似乎穷尽了所有的组合。

你小学上课传过纸条吗

“我现在能体会那些半路拦截纸条的人是什么心态了。”这是S君第一次使用Charles时对我说的话。

从此以后,我很少看到S君分析网页了。因为他学会了在爬虫开发的过程中,首先通过中间人攻击技术分析微信小程序和手机App。这种方式往往能够直接获得数据,拿到数据以后就能直接储存,再也不用写烦人的XPath或者长的跟表情符号一样的正则表达式了。

有一天,我在玩一个网页版的黑客解密游戏,在网页上寻找某个地方隐藏起来的密码,然后输入每一关的回答框中,答对才能进入下一关。

游戏有12关,而我卡在了第6关。只见S君拿着电脑走到我面前,指着第12关的通关页面跟我炫耀。

“你是不是用MITMProxy替换了这个网站的Js文件?”

“果然还是瞒不过师傅你啊。”

“你拦截了别人的纸条,做了修改,然后又叠好继续传下去,你有考虑过发纸条的人和收纸条的人的感受吗?”

“我小学时候不传纸条,都是妹子直接约我的。”

加密?不存在的

“前端没有秘密”。S君在成功逆向了一个网站的Js文件以后如是对我说。

“那是因为这个网站的Js代码就赤裸裸地放在你面前,完全没有混淆。”我对S君说道。

“不怕,我可以用Node.js来运行混淆过的代码。我已经搭建好Node.js服务了,只要把Js代码传进去,他就会把结果给我返回回来。”S君对此似乎一脸自行。

“你什么时候学会的Node.js?”

“这不是师傅你说过技多不压身吗?既然做爬虫需要动JavaScript,那我顺手就把Node.js给学了。”S君毫不畏惧的表情,似乎证明他已经猜透了我要问什么。

“那如果目标没有网站,只有App呢?”

“不怕,Android 逆向工程我也顺便研究了一点。Java我也看得懂。”

“看来这些已经不需要我再教你了。”

你肯定薅了直播答题的羊毛吧

去年年底的直播答题着实火了一把。那个时候,我和S君分开已经有一段时间了。我相信,在全民答题的每一个夜晚,S君的电脑上一定连着不少于六台安卓手机。这些手机运行着不同的答题平台,能够自动读取屏幕上的问题并自动选择答案。

我把安卓自动化测试技术教给S君,本来是让他结合爬虫,实现群控从而抓取一些难以处理的数据,但我相信他肯定会用来答题。

变通,这一点他学的越来越好了。

只希望他不要成为羊毛党。

后记

后来,我再也没有见过S君这样有趣的人。所以我把我和S君的故事写成了一本书:《Python爬虫开发 从入门到实战》,现在已在京东,当当与亚马逊上架。

京东:https://item.jd.com/33577263621.html

当当:http://product.m.dangdang.com/25349717.html

亚马逊:https://www.amazon.cn/dp/B07HGBRXFW

爬虫是一门杂学。因为在一个完整的开发过程中,需要涉及到的知识可以包括但不限于:Python,HTML,JavaScript,正则表达式,XPath,数据库,Redis,消息队列,Docker,ELK,Hadoop,数据分析,ETL,中间人攻击,自动化测试技术,可视化……

这其中的任何一项,在一个大公司里面都可以让很多人来做。

就像这篇文章里面反复出现的一个词:变通。

只要能够获得数据,任何技术都可以使用。所谓草木竹石皆可为剑。

爬虫开发,绝对不仅仅是Scrapy,PySpider,requests这些框架或者库的使用。所以在这本书里面,我也刻意减少了框架使用说明的部分,而把重点放在了各种突破反爬虫机制或者使用变通的方法绕过反爬虫机制的方法论和实践中。

通过学习爬虫,你最后不一定选择爬虫工程师这个岗位,但是在学习爬虫的过程中,你将会接触到的各种工具,方法,服务组件,都会在你以后的生活和工作中帮到你,让你知道,在遇到一个问题的时候,解决方法在哪个地方。

目录
相关文章
|
算法 数据处理 调度
【C++ 优先队列】了解 C++优先队列中操作符重载的实现
【C++ 优先队列】了解 C++优先队列中操作符重载的实现
205 0
|
Oracle 关系型数据库 Linux
Linux下 su命令与su - 命令有什么区别?
Linux下 su命令与su - 命令有什么区别?
329 0
elementUI el-upload上传组件实战使用
elementUI el-upload上传组件实战使用
|
搜索推荐 安全 物联网
如何使用 ZoomEye 搜索引擎保姆级教程(附链接)
如何使用 ZoomEye 搜索引擎保姆级教程(附链接)
Winform中Textbox、NumericUpDown等修改高度,禁止输入数字或内容的实现
Winform中的Textbox、NumericUpDown控件通常在单行的情况下,无法直接通过`Height`属性修改高度,但很多时候我们需要调整其高度,使其显示的更加合理,主要介绍三种方法...
3275 0
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
4697 0
【密码学】一文读懂CMAC
|
10月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
iOS开发 MacOS Windows
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
|
10月前
|
NoSQL API Redis
Redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
193 16
|
10月前
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。