这篇文章没有代码,请放心阅读(送书活动在末尾)。
多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和 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 爬虫开发 从入门到实战》,现在已在京东,当当与亚马逊上架。
相信我一次,这本书真的不是从入门到放弃系列。
爬虫是一门杂学。因为在一个完整的开发过程中,需要涉及到的知识可以包括但不限于:Python,HTML,Javascript,正则表达式,XPath,数据库,Redis,消息队列,Docker,ELK,Hadoop,数据分析,ETL,中间人攻击,自动化测试技术,可视化……
这其中的任何一项,在一个大公司里面都可以让很多人来做。
就像这篇文章里面反复出现的一个词:变通。
只要能够获得数据,任何技术都可以使用。所谓草木竹石皆可为剑。
爬虫开发,绝对不仅仅是 Scrapy,PySpider,requests 这些框架或者库的使用。所以在这本书里面,我也刻意减少了框架使用说明的部分,而把重点放在了各种突破反爬虫机制或者使用变通的方法绕过反爬虫机制的方法论和实践中。
通过学习爬虫,你最后不一定选择爬虫工程师这个岗位,但是在学习爬虫的过程中,你将会接触到的各种工具,方法,服务组件,都会在你以后的生活和工作中帮到你,让你知道,在遇到一个问题的时候,解决方法在哪个地方。
感谢你读到了这一行,希望我这篇蹩脚的软文没有让你觉得讨厌。新书上架,回馈 V 友。我将会从所有留言的 V 友中选中 6 人,一人赠送一本《 Python 爬虫开发 从入门到实战》。
按照惯例,选人的方式如下:
抽奖所用的数据,见图中红框框住的这一列。
开奖啦开奖啦!
收盘价如图:
抽奖代码如下:
恭喜以下六位中奖。
@Dv @cosmo @ycgk @zerOlike @Mrxiaoxie @wobushizhangsan
其中576号是我自己。所以顺延给577号。
请中奖的同时,使用base64编码自己的邮箱回复到本帖并@我。我会使用Y29udGFjdEBraW5nbmFtZS5pbmZvCg== 对应的邮箱给各位发送邮件确认领奖事宜。
我创建了本书的读者交流群,如果大家对本书有什么期待或者疑问, 可以在群里面进行交流。
加群方法:
添加微信公众号
回复:读者交流
![]() | 1 rayless 2018-09-27 09:46:42 +08:00 占楼 |
2 muyiluop 2018-09-27 09:54:51 +08:00 这个抽奖方式很炫酷呀 |
![]() | 3 hflyf123 2018-09-27 09:56:22 +08:00 ![]() 前排占楼,这帖子可以当书的前言了,广告有点硬 |
![]() | 4 redye 2018-09-27 09:58:09 +08:00 占楼,S 君真是一个有意思的人呐 |
![]() | 5 fu2kingCode 2018-09-27 09:58:11 +08:00 占楼 |
6 iwfan 2018-09-27 09:58:28 +08:00 好的, 我来学一门杂学 |
7 evegod 2018-09-27 09:59:35 +08:00 这个方法实在是相当的有趣了啊 |
8 siyemiaokube 2018-09-27 10:00:34 +08:00 via iPhone 很酷炫啊,滋瓷 |
9 osp321 2018-09-27 10:01:37 +08:00 参与参与!!! |
![]() | 10 huangzhe8263 2018-09-27 10:02:01 +08:00 via Android 分母 |
![]() | 11 mouse0809 2018-09-27 10:03:54 +08:00 占楼、点个赞! |
![]() | 12 yegg 2018-09-27 10:06:22 +08:00 via iPhone Cool |
![]() | 13 shell314 2018-09-27 10:06:47 +08:00 via Android 支持 |
![]() | 14 hauk0101 2018-09-27 10:07:11 +08:00 via Android 喜欢这种故事呀 |
15 ctaodream 2018-09-27 10:07:20 +08:00 我有点想要这本书了 |
16 LeonKennedy 2018-09-27 10:08:50 +08:00 虽然没看懂这个抽奖方式,我还是过来凑个热闹吧 |
17 yuyu2140 2018-09-27 10:08:56 +08:00 这个抽奖方式很炫酷呀 |
18 fanhuai 2018-09-27 10:09:28 +08:00 哈哈哈,占楼 |
19 tony2lord 2018-09-27 10:09:42 +08:00 我来组成分母 |
![]() | 20 tinybaby365 2018-09-27 10:10:51 +08:00 分母一个 |
![]() | 21 yingos 2018-09-27 10:11:49 +08:00 via iPhone 真的羡慕说学啥就学啥的人 |
![]() | 22 wspsxing 2018-09-27 10:12:01 +08:00 via Android 分母+ |
23 yldhgs 2018-09-27 10:12:02 +08:00 via Android 占个楼 |
![]() | 24 zhang1215 2018-09-27 10:12:55 +08:00 分母加一 |
![]() | 25 itfun 2018-09-27 10:14:21 +08:00 via iPhone test |
![]() | 26 Sanko 2018-09-27 10:14:32 +08:00 via Android 分母 |
27 oneast 2018-09-27 10:14:52 +08:00 via iPhone 占楼,炫酷的抽奖 |
![]() | 28 ashin 2018-09-27 10:16:09 +08:00 +1 |
29 mkstring 2018-09-27 10:18:15 +08:00 分母 |
![]() | 30 dove1011 2018-09-27 10:18:26 +08:00 这个抽奖方式不错啊 |
31 moguanqi 2018-09-27 10:18:53 +08:00 分母+ |
![]() | 32 moresteam 2018-09-27 10:21:27 +08:00 抽奖专用楼 |
33 itplanes01 2018-09-27 10:23:05 +08:00 via Android 占楼,支持 |
34 huangda1995 2018-09-27 10:23:20 +08:00 via Android 占楼 |
35 carpediemvv 2018-09-27 10:24:20 +08:00 via Android 不错,占楼,抽不到也要买一本 |
![]() | 36 shelterz 2018-09-27 10:25:17 +08:00 via iPhone 分母 |
![]() | 37 Nickkkkkk 2018-09-27 10:25:46 +08:00 分母 + 1 |
![]() | 38 rockdodos 2018-09-27 10:26:42 +08:00 分母来了 |
![]() | 39 Nagisa1992 2018-09-27 10:27:25 +08:00 分母 |
![]() | 40 Culture 2018-09-27 10:27:35 +08:00 不明觉厉 |
41 Donate 2018-09-27 10:28:39 +08:00 via iPhone 作者好像挺有趣.. |
42 supermooc 2018-09-27 10:28:50 +08:00 资瓷 |
![]() | 43 Reznik 2018-09-27 10:29:59 +08:00 这帖子是作者本人写的吗,帖子挺有意思的,书也可能有点意思。 支持一下 |
44 idelo 2018-09-27 10:30:26 +08:00 故事写的很好 |
![]() | 45 samlee123 2018-09-27 10:32:47 +08:00 分子 |
![]() | 46 Sabermadao 2018-09-27 10:32:53 +08:00 nice |
![]() | 47 shower 2018-09-27 10:37:09 +08:00 占楼 |
![]() | 48 xiaolu 2018-09-27 10:39:41 +08:00 via iPhone 站楼 |
![]() | 49 boyxy120 2018-09-27 10:41:09 +08:00 分母 + 1 |
50 laofuzi 2018-09-27 10:42:39 +08:00 有意思 |
![]() | 51 JustinJie 2018-09-27 10:44:13 +08:00 分母 |
![]() | 52 li27962278 2018-09-27 10:44:54 +08:00 有点意思 |
![]() | 53 itskingname OP @Reznik 对,就是我,写书和写故事的人都是我。 |
54 ziyue002 2018-09-27 10:46:29 +08:00 占楼 |
![]() | 55 c466934322 2018-09-27 10:47:22 +08:00 厉害的大佬,变通。。。受教了 |
![]() | 56 wonders2002ok 2018-09-27 10:47:36 +08:00 占楼,看结果。 |
![]() | 57 hugh114 2018-09-27 10:48:11 +08:00 当个分母吧。。。 |
![]() | 58 OldDriverKing 2018-09-27 10:50:35 +08:00 好想要一本,感觉作者的编程也会很有意思,感谢! |
![]() | 59 Eleflea 2018-09-27 10:52:30 +08:00 via Android 分母++ |
60 wukongkong 2018-09-27 10:52:59 +08:00 via Android 努力当分子 |
61 MaxTan 2018-09-27 10:53:16 +08:00 分母 |
![]() | 62 Bakumon 2018-09-27 10:53:55 +08:00 送书了!!! |
![]() | 63 dapengzhao 2018-09-27 10:54:05 +08:00 分母 |
![]() | 64 robertding 2018-09-27 10:55:39 +08:00 所以需要操盘一下网易么 |
![]() | 65 DylanZ 2018-09-27 10:57:05 +08:00 看不懂... |
66 deepSeaCode 2018-09-27 10:57:07 +08:00 支持一下,抽奖方式很有趣 |
![]() | 67 0vels 2018-09-27 11:00:20 +08:00 感觉不错 |
68 ThunderStruck 2018-09-27 11:01:59 +08:00 当个分母+1 |
![]() | 69 chainchan 2018-09-27 11:03:44 +08:00 排队 |
70 paladinx 2018-09-27 11:04:05 +08:00 支持支持,抽奖一下 |
![]() | 71 hewenlongstu 2018-09-27 11:05:25 +08:00 支持 |
![]() | 72 sloppysop 2018-09-27 11:07:23 +08:00 真的看完了,写的很好,准备买书了 |
73 razaura 2018-09-27 11:08:01 +08:00 +++ |
![]() | 74 dao326 2018-09-27 11:08:47 +08:00 不错啊!哈哈,耐着性子看完了。。 |
75 BryanYue 2018-09-27 11:09:04 +08:00 支持下 |
![]() | 76 simpler 2018-09-27 11:09:55 +08:00 感觉抽奖很有意思 |
![]() | 77 simpler 2018-09-27 11:10:09 +08:00 先占个楼 |
![]() | 78 Depth 2018-09-27 11:10:19 +08:00 需要个操盘内幕一下。 |
![]() | 79 LanAiFaZuo 2018-09-27 11:11:58 +08:00 先占个楼 |
![]() | 80 Nelda 2018-09-27 11:16:21 +08:00 感觉很有意思 |
81 shangbear 2018-09-27 11:16:24 +08:00 支持 |
82 ding5zhuan 2018-09-27 11:16:33 +08:00 居然看完了,我来占楼当分母 |
![]() | 83 tanglijun 2018-09-27 11:16:42 +08:00 支持 |
![]() | 84 liufish 2018-09-27 11:17:06 +08:00 占楼,分母+1 |
85 hhz 2018-09-27 11:18:47 +08:00 文章写得不错 |
![]() | 86 dokimaster 2018-09-27 11:21:27 +08:00 拉低中奖几率 |
![]() | 87 cein 2018-09-27 11:21:34 +08:00 nice |
88 huangshaolong 2018-09-27 11:21:51 +08:00 有趣的文章 |
![]() | 89 babedoll 2018-09-27 11:22:03 +08:00 分母 |
![]() | 90 6yong 2018-09-27 11:22:35 +08:00 via iPhone good |
91 rookiewhy 2018-09-27 11:22:37 +08:00 分母 |
92 rookiewhy 2018-09-27 11:22:58 +08:00 分母+1 |
![]() | 93 alw1329 2018-09-27 11:23:29 +08:00 支持 |
![]() | 94 degod 2018-09-27 11:24:03 +08:00 via Android 拉低中奖率 |
95 PERFECTCN 2018-09-27 11:25:03 +08:00 终于心动了 |
![]() | 96 guolaopi 2018-09-27 11:28:17 +08:00 不要钱的占楼 |
![]() | 97 youngitachi 2018-09-27 11:28:50 +08:00 我就想问,人名和公司名的代号,是故意的吗? 虫师的修炼之道,搞个副标题也可以啊 |
98 0x000007 2018-09-27 11:30:48 +08:00 占楼 |
99 xcjx 2018-09-27 11:31:13 +08:00 花哨的抽奖方式…对爬虫并不感兴趣,占个便宜吧 |
![]() | 100 xiexingk 2018-09-27 11:33:36 +08:00 分母 |