记得有次发现有些网页抓不下来,开始好久都找不着头脑,废了九牛二虎之力,终于发现是http请求处理的问题。深入代码才看到,http协议的这部分代码都是写这个人自己实现的,只是实现了最基本的协议,也就是,建立socket连接,发送请求,然后通过socket接收数据,解析响应头(response headers)。然而这个响应头连http重定向都没有处理,凡是重定向的响应就都失败了,自然那些网页就抓不下来了。
为了抓到那些响应,我们就不得不继续完善http协议的解析功能,贡献了很多代码。。
为什么要自己实现基本的http协议呢?难道就没有好的第三方库可以用吗?现在想来,那个爬虫也就是看上去能用,听上去高大上,实际上问题很多。
那个网络爬虫程序维护了一两年最终放弃了,后来的爬虫技术都开始用Python来实现了。
现在如果让我实现一个网络爬虫,二话不说,肯定是要用Python。究其原因,可能有已经几点经验和教训跟大家分享一下。
1. 变幻莫测的网络爬虫
写过爬虫,可能都有这么一个感觉,就是昨天跑的好好的爬虫,今天可能就出问题,不work了。这里面的原因可能就是,网页的改版,网站的封锁等等。遇到这种情况,我们就必须在最快的时间内调试找出问题所在,并以最快的速度修复,使其尽快上线跑起来。
2. 随机应变的Python
鉴于上述爬虫复杂的变化,写网络爬虫就必须依赖一个快速开发、灵活的语言,同时又有完整丰富的库支撑。而同时具备这些优点的语言,无疑就是Python了。所以,Python天然就是为爬虫而生,爬虫天然就是择Python而用。
3. 简洁丰富的Python
看到Python和网络爬虫这种天然相连的关系,小猿们不禁要问,Python适合网络爬虫的天然属性都是哪些呢?不急,听老夫慢慢道来。
3.1 简洁的语法
Python的语法非常简单,提倡简洁而不简单,Python开发者的哲学就是“用一种方法,最好是只有一种方法来做一件事”,这种哲学让你写的代码没有太多个人风格,易于让他人看懂你的代码,也让你轻易看懂别人的代码。Python的简洁,也让开发者可以仅用几行代码就实现一个功能,而同样的功能用Java可能要几十行上百行,要用C++可能是几百行。
大家可以试试在Python解释器里面运行import this,来品味一下Python的哲学:
>>> import this
> The Zen of Python
> by Tim Peters
> Beautiful is better than ugly.
> Explicit is better than implicit.
> Simple is better than complex.
> Complex is better than complicated.
> Flat is better than nested.
> Sparse is better than dense.
> Readability counts.
> Special cases aren‘t special enough to break the rules.
> Although practicality beats purity.
> Errors should never pass silently.
> Unless explicitly silenced.
> In the face of ambiguity, refuse the temptation to guess.
> There should be one-- and preferably only one --obvious way to do it.
> Although that way may not be obvious at first unless you‘re Dutch.
> Now is better than never.
> Although never is often better than *right* now.
> If the implementation is hard to explain, it‘s a bad idea.
> If the implementation is easy to explain, it may be a good idea.
> Namespaces are one honking great idea -- let‘s do more of those!
Python简洁的语法,让你实现、修改爬虫都变得轻松起来。也就是说,写起来贼快!人生苦短,何不Python
原文地址:https://blog.51cto.com/14318113/2390631