这篇文章没有代码,请放心阅读(送书活动在末尾)。
多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和 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== 对应的邮箱给各位发送邮件确认领奖事宜。
我创建了本书的读者交流群,如果大家对本书有什么期待或者疑问, 可以在群里面进行交流。
加群方法:
添加微信公众号
回复:读者交流
101
Dori 2018-09-27 11:34:27 +08:00
操盘网易已经安排上了、
|
103
diduanjiucai 2018-09-27 11:35:02 +08:00
分母+1
|
104
Dori 2018-09-27 11:36:07 +08:00
请给我安排一下
|
105
aaahhh123 2018-09-27 11:36:38 +08:00
当个分母
|
106
aaahhh123 2018-09-27 11:36:49 +08:00
分母
|
107
soho176 2018-09-27 11:37:17 +08:00
万一中了那!
|
108
soho176 2018-09-27 11:37:47 +08:00
爬虫好!
|
109
AntonyXin 2018-09-27 11:37:52 +08:00
分母来了
|
110
lonfall 2018-09-27 11:38:16 +08:00
有点意思
|
111
robinshi2010 2018-09-27 11:38:21 +08:00
66666
|
112
yuanchao 2018-09-27 11:38:53 +08:00
想要 +1
|
113
scyuo 2018-09-27 11:38:57 +08:00
来组成分母。
|
114
ivanor 2018-09-27 11:39:26 +08:00
完全 0 基础不会 hello world 的看完这本书会用爬虫吗?
|
115
sniper1211 2018-09-27 11:40:57 +08:00
o
|
116
foolyf 2018-09-27 11:41:11 +08:00
有点意思
|
117
jyn1229 2018-09-27 11:41:11 +08:00 via Android
Thanks
|
118
guloulan 2018-09-27 11:41:43 +08:00
来,做个分母
|
119
sandral 2018-09-27 11:41:43 +08:00
新人占楼
|
120
98jiang 2018-09-27 11:42:08 +08:00
当个分母
|
121
eilian 2018-09-27 11:42:38 +08:00
分母
|
122
yooooooooo 2018-09-27 11:43:14 +08:00
软文写得很有意思
|
123
baicheng10 2018-09-27 11:43:17 +08:00
占个楼
|
124
co3site 2018-09-27 11:44:07 +08:00 via Android
做个分母
|
125
limao693 2018-09-27 11:44:34 +08:00
抽奖方式学到了,你很会讲故事
|
126
terencehan 2018-09-27 11:44:48 +08:00
分母一波吧~~
|
127
ycgk 2018-09-27 11:45:02 +08:00
也过来学习一下,多一门技术。
|
128
pkokp8 2018-09-27 11:45:37 +08:00 via Android
花式抽奖
求一个大佬操盘网易让自己中奖 |
129
pezy 2018-09-27 11:48:26 +08:00
只想说,这个书名,毫无辨识度,而且超级烂俗啊。。。
|
130
Jbys 2018-09-27 11:49:56 +08:00
分母
|
131
shenmising 2018-09-27 11:50:54 +08:00
因崔思婷
|
132
ljspython 2018-09-27 11:52:21 +08:00
做个分子
|
133
hyi 2018-09-27 11:52:30 +08:00
来当个分母
|
134
diligency 2018-09-27 11:53:04 +08:00
爬虫好!
|
135
ilaipi 2018-09-27 11:54:47 +08:00
故事有意思!一直在用 node 写爬虫。但是 kafaka 还没用过
|
136
baicheng10 2018-09-27 11:55:33 +08:00
故事可以,够软,已下单。
|
137
ylhawj 2018-09-27 11:56:06 +08:00 via iPhone
我居然看完了...不过写得蛮有意思...先买一本看看...写得不好的话再退货吧...哈哈
|
138
sorra 2018-09-27 11:56:18 +08:00
看起来比较新鲜,可惜了书名
|
139
pingpp00 2018-09-27 11:57:07 +08:00
拉低中奖率,哈哈哈哈
|
140
zthinking 2018-09-27 12:00:26 +08:00
这居然被列入「杂学」。。
|
141
BlongLee 2018-09-27 12:00:33 +08:00
呔,我要这本书
|
142
watara 2018-09-27 12:00:36 +08:00
力当分子
|
143
NickCarter 2018-09-27 12:03:36 +08:00 via iPhone
分母
|
144
chen7228413 2018-09-27 12:05:12 +08:00
强势充当分子
|
145
dwhzy 2018-09-27 12:05:33 +08:00
我喜欢楼主这种选择中奖的方式,哈哈~
|
146
ACool 2018-09-27 12:06:29 +08:00 via Android
文章写得不错啊
|
147
laurance1993 2018-09-27 12:07:08 +08:00
分子
|
148
wenning 2018-09-27 12:08:19 +08:00
分母
|
149
fiht 2018-09-27 12:09:51 +08:00
拉低中奖率
|
150
mantout 2018-09-27 12:10:12 +08:00
+1
|
151
notgood 2018-09-27 12:10:38 +08:00 via iPhone
谢谢你的
|
152
pauly 2018-09-27 12:11:15 +08:00 via iPhone
安排上了
|
153
pipecat 2018-09-27 12:11:55 +08:00 via iPhone
我来组成分母
|
154
Renven1 2018-09-27 12:17:29 +08:00
分母分母
|
155
isweal 2018-09-27 12:17:42 +08:00 via iPhone
好,我来组成分母
|
156
natforum 2018-09-27 12:18:23 +08:00
分母
|
157
xiaowangge 2018-09-27 12:19:29 +08:00
|
158
carryer 2018-09-27 12:21:33 +08:00
分母+1
|
159
proudofmyself911 2018-09-27 12:21:58 +08:00 via Android
天选之人
|
160
HXM 2018-09-27 12:22:54 +08:00 via Android
写的还挺有意思
|
161
DixCouleur 2018-09-27 12:23:11 +08:00 via Android
抽奖方式酷炫+1
|
162
ihjk 2018-09-27 12:24:31 +08:00
分母+1
|
163
green15 2018-09-27 12:26:37 +08:00 via iPhone
来回复抽奖~万一中了呢?
|
164
caryqy 2018-09-27 12:26:56 +08:00
分母
|
165
ethanlu 2018-09-27 12:27:08 +08:00 via Android
分母
|
166
Anshi 2018-09-27 12:27:29 +08:00
抽奖方式没有看懂...
|
167
470326964 2018-09-27 12:28:27 +08:00
很牛逼 要书
|
168
flycare 2018-09-27 12:29:52 +08:00
日常分母
|
169
Ginray 2018-09-27 12:30:33 +08:00
MARK
|
170
openbsd 2018-09-27 12:30:39 +08:00
从没抽中过书
|
171
itskingname OP @zthinking 我觉得可以给杂学打一个引号。我想表达的意思是,要学爬虫,需要附带学习很多其他东西。也许在这些附带学习的东西里面,你找到了你的真爱,这也算是我这本书的功德一件~
|
172
feather0809 2018-09-27 12:31:14 +08:00
分母+1
|
173
itskingname OP @ivanor 第一章有 Python 的基础入门。但是限于篇幅,可能会有一些我以为我讲清楚了但是没有讲清楚的地方。
|
174
itskingname OP @youngitachi 嘿嘿,是故意的。
|
175
zhou00 2018-09-27 12:33:19 +08:00
分母
|
176
kerie 2018-09-27 12:33:27 +08:00
import hashlib
szzs = "2,795.79" # 上证指数价格还是网易价格?反正价格可以在楼层之前可以确定 floor = 153 # 2018 年 9 月 29 日 10:00 的总楼层数,之前大家还可以拼一把 winners = map(lambda char: int(hashlib.sha256(szzs + char).hexdigest(), 16) % floor, "Python") print sorted(winners) |
177
zacheryWu 2018-09-27 12:34:11 +08:00
软文写的挺有趣的
|
178
cdlnls 2018-09-27 12:34:30 +08:00 via iPhone
当分子来了
|
179
sbybfai 2018-09-27 12:36:07 +08:00 via iPhone
mark
|
180
pszww 2018-09-27 12:39:41 +08:00
抽奖方式真 6 ……
|
181
mauve 2018-09-27 12:42:51 +08:00 via Android
分母
|
182
zerOlike 2018-09-27 12:42:56 +08:00
抽奖的方式的确是 6 的不行
|
183
yixuankeer 2018-09-27 12:43:47 +08:00 via Android
很赞,先试试抽奖,手臭的话再买 23333
|
184
Mrxiaoxie 2018-09-27 12:44:03 +08:00
麻烦安排一下我到分子去
|
185
wwwaaa 2018-09-27 12:44:13 +08:00 via Android
分子
|
186
daopu 2018-09-27 12:45:26 +08:00 via Android
一股文艺气息的程序员
|
187
xuecat 2018-09-27 12:45:27 +08:00
分母+1
|
188
strawtam 2018-09-27 12:46:16 +08:00 via Android
这个抽奖可以
|
189
duqing1230123 2018-09-27 12:46:28 +08:00
抽风!!!
|
190
KeatingSmith 2018-09-27 12:46:54 +08:00
这个抽奖可以
|
191
oicebot 2018-09-27 12:48:56 +08:00
这个太厉害了…… 当个分母,抽不到就买书
|
192
Fulcrum 2018-09-27 12:50:35 +08:00 via Android
感觉爬虫不是怎么爬,而是爬什么的问题
|
193
Norie 2018-09-27 12:50:47 +08:00 via Android
看不懂该咋办啊
|
194
jasonqiao36 2018-09-27 12:51:09 +08:00 via Android
分母
|
195
ljchyh 2018-09-27 12:53:15 +08:00
参与一下
|
196
xml123 2018-09-27 12:53:34 +08:00
我觉得这个软文写的不行(
|
197
xiaoliuzi 2018-09-27 12:54:36 +08:00
厉害了,占楼
|
198
itskingname OP @xml123 我自己也觉得写的不想,有很多想说的,但是写不出来。
|
199
FelixZeng 2018-09-27 12:59:06 +08:00
厉害了,插一 jio
|
200
ezyx 2018-09-27 13:00:14 +08:00 via Android
居然看完了。。
|