谢乾坤 | Kingname

给时光以生命。

有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现。

先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行Javascript代码,就能轻轻松松识别你是否使用了Selenium + Chromedriver模拟浏览器。

我们来看一个例子。

阅读全文 »

大家经常在一些博客中看到这样的说法:

1
a += 1

等价于

1
a = a + 1

这种说法实际上并不准确。

我们来看一个例子:

1
2
3
4
5
6
7
8
9
10
>>> a = [1, 2, 3]
>>> a += (4,)
>>> a
[1, 2, 3, 4]

>>> a = [1, 2, 3]
>>> a = a + (4,)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list

这里报错了,说明a += ba = a + b并不是完全等价的。

阅读全文 »

想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D、Cocos2dx-*、Android 原生 App、iOS App、Windows Mobile……。

阅读全文 »

在Python中,你可能会发现这样一个奇怪的现象:

1
2
3
4
5
6
>>> 2 == 2 > 1
True
>>> (2 == 2) > 1
False
>>> 2 == (2 > 1)
False

为什么会出现2 == 2 > 1的结果为True?如果说这是运算符的优先级问题,那么后两个式子为什么又都是False

实际上这涉及到了Python的链式对比(Chained Comparisons)。在其他语言中,有一个变量x,如果要判断x是否大于1,小于5,可能需要这样写代码:

1
if (1 < x and x < 5)

但是在Python中,可以这样写代码:

1
if 1 < x < 5

Python能够正确处理这个链式对比的逻辑。

回到最开始的问题上,==等于符号和<小于符号,本质没有什么区别。所以实际上2==2>1也是一个链式对比的式子,它相当于2==2 and 2>1。此时,这个式子就等价于True and True。所以返回的结果为True。

关于链式对比,可以看官方文档:https://docs.python.org/3/reference/expressions.html#comparisons

2018年,我的第一本书出版了。

离开北京,来到到杭州,加入了网易游戏伏羲人工智能实验室。

在这一年里面,一共看完了21本书:

  • 罗贯中——《三国演义》
  • 王小波——《黄金时代》
  • 当年明月——《明朝那些事儿1-7》
  • 瑞·达利欧《原则》
  • 毛姆《月亮与六便士》
  • Robert C. Martin——《代码整洁之道》
  • John Sonmez——《软技能——代码之外的生成之道》
  • 尤瓦尔·赫拉利——《今日简史》
  • 汪曾祺——《生活是很好玩的》
  • 孙武——《孙子兵法》
  • ???——《战国策》
  • 李鑫——《数据产品经理——从零经验到令人经验》
  • Norman Lewis——《Word Power Made Easy》
  • 刘飞——《从点子到产品 : 产品经理的价值观与方法论》
  • 李诞——《笑场》

在LeetCode刷了九十多题:https://github.com/kingname/LeetCode

写了13篇博客。

2019年1月,我的第二本书即将出版。

2019年新年目标:

  • 在2019-12-31之前,读完12本书,并为每一本书作出思维导图。
  • 在2019-12-31之前,微信公众号的关注量超过5000人。
  • 在2019-06-30之前,在Medium上发布3篇技术文章。
  • 在2019-10-31之前,练习英语听力和复述能力,做到150词内的句子,听一次就能复述成功。
  • 在2019-03-31之前,学会布鲁斯口琴吹气压音,8月31日之前脱稿演奏卡农。12月31日脱稿演奏未闻花名。
  • 在2019-07-31之前,使用golang完成一个记单词的网站。
  • 在2019-09-30之前,认识至少5个新朋友,并通过与他们聊天练习聊天技巧,努力成为一个会聊天的人。
  • 在2019-10-01之前,累计跑步108公里。

《跳出任务管理的泥沼,拥抱甘特图的怀抱》一文中,我谈到了使用甘特图来规划任务。甘特图更多的关注每一个任务的进度上。那么如果我希望了解项目整体的进度,应该如何选择呢?此时就需要引入另一个简单又强大的工具:燃尽图(Burn down chart)。

阅读全文 »

在上一篇文章中介绍了下载器中间件的一些简单应用,现在再来通过案例说说如何使用下载器中间件集成Selenium、重试和处理请求异常。

阅读全文 »

中间件(Middleware)

中间件是Scrapy里面的一个核心概念。使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫。

“中间件”这个中文名字和前面章节讲到的“中间人”只有一字之差。它们做的事情确实也非常相似。中间件和中间人都能在中途劫持数据,做一些修改再把数据传递出去。不同点在于,中间件是开发者主动加进去的组件,而中间人是被动的,一般是恶意地加进去的环节。中间件主要用来辅助开发,而中间人却多被用来进行数据的窃取、伪造甚至攻击。

在Scrapy中有两种中间件:下载器中间件(Downloader Middleware)和爬虫中间件(Spider Middleware)。

这一篇主要讲解下载器中间件的第一部分。

阅读全文 »
0%