Ask and Learn

通过爬虫来学习编程

李笑来的公众号名称很有意思,叫「学习学习再学习」,人活着不学习,那只会让自己一天天生锈,作为一个有热情的程序员,学习更显重要,很多开发的新手经常会问,如何才能提高自己的编程技艺呢?我当然也有自己的法宝:写爬虫。

以前在 GDG 西安的邮件列表中我有提到过通过写爬虫来磨炼编程技艺,今天我把这些宝贵的经验整理一下,希望对编程的新手有所帮助。

事实上,我的 Web 开发技能和 Python 技能都是通过写爬虫抓取 18X 网站的资源一点点提高的,既能满足消遣的需求,又能提高编程的技艺,这件事儿怎么算都很值。

image

那么,为什么说编写爬虫能够磨炼编程技艺呢?从编辑爬虫中又能学习到哪些开发的知识呢,听我慢慢道来:

  • Web 开发基础: 要从页面中取到想要的东西,首先要了解页面是怎么构成的,这需要 HTML 的基础知识,不用刻意去背书,通过浏览器的审查元素功能,标签树一目了然,接触的多了就知道各个标签的用处了,有些页面是有交互的,于是你还能学习一下 JavaScript 的基础。
  • 正则表达式: 要从杂乱的网页源码中找到提取出自己感举的内容,在简单的情况下,正则当然是不二之选,而正则表达式正是程序员的一个利器呀。
  • HTTP 协议: 要模拟发送请求,你需要对请求的头、鉴权呀什么的有所了解,模拟发送请求正是编写爬虫最常见的工作了,相比于去死啃课本,这样在实践中学习,感同身受,不是更有效率吗?
  • IO 流: 既然要抓美♂图,总得读写文件吧,你说你不练习一下文件读写怎么成?
  • 异常处理: 并不是每个页面都是很规律的,总会遇到未知的问题,或者网页改版了,你以前的脚本就失效了,这时需要使用异常处理来捕捉这些例外的情况,并作相应的处理。
  • 并发: 一个图一个图的抓取当然比较慢了,你要是等不急了,那自然得学习一下多线程的处理,话说并发这里对小白来说还是开发之路上的一个挑战,但是有了抓图的动力,这挑战就小意思了。
  • 数据库: 一个网站的资源何其多,而且不同的页面之间可能会有关联,直接使用内存或者文件来处理这些资源必定是非常麻烦的,这时候如果你掌握数据库的知识,那可以把想要的数据结构化的保存下来,方便进一步的分析和处理。
  • 各种 Parser: 如果你遇到的页面非常复杂,用正则会让你发疯,为了不让自己死掉太多的脑细胞,使用一个合适解析器无疑会轻松很多。HTTP 请求返回的内容可能是一个 HTML,也可能是 XML 或者 JSON,熟练掌握这些解析器,对以后做 Web 开发也很有益处。Python 里面有许多好用的库:lxml, pyquery, beautifulsoup 之类的。
  • 代理: 兄弟,逮住一个羊猛撸羊毛不被发现才怪,你需要了解如何动态设置代理,比如维护一个代理列表,随机切换什么的。而且现在要做开发,你不懂用梯子,简直举步维艰,指望从百度找到有用的东西,迟早会死在井底。
  • 编码转换: 你知道的,X 站一般是香港和台湾那边比较多,一般都大五码,或者 GBK,为了统一,你需要把它们处理成 UTF-8,如果你在 Windows 平台,编码处理会更头痛,这是硬功。
  • Chrome 扩展: 一些的网站的登陆验证规则实在是太难了,甚至算法都是混淆过的,还原登录逻辑十分困难,不要担心,Chrome 扩展竭诚为您服务,页面嵌入脚本,跨域请求都不在话下,直接跳过登录过程,抓取内容可以存入 localStorage 甚至可以用 file api 导出,分析页面就更简单了,可以直接用 jQuery 了。
  • DevTool: 要分析请求的构成,你需要熟悉使用 Chrome Development Tool 或者 Firebug,这是 Web 开发的调试利器,都是以后能用上的东西。
  • 邮件: 我抓取下来的图和视频存在哪里呢,我一般都会备份它们到邮箱(QQ邮箱,图片预览,视频在线播放,你懂的),手动上传那不是程序员该干的事,你得学习使用编程的方式来上传附件到邮箱,你又顺便学习了如何使用编程的方式发邮件,以后到了公司,上面让你做个发邮件的功能,还不是手到擒来?
  • 工具和框架: 如果你的爬虫上了规模,维护变得困难,或者需要自动执行,你可能还得学习一下队列、定时任务,以及一些成熟的爬虫框架,比如 scrapy。
  • 打包: 下的图有可能你想打它们打包保存,你还需要学习使用编程的方法创建压缩包。
  • 日志和调试: 要了解爬虫的抓取进度,你需要通过 Logging 工具来记录一些上下文,这样如果出错,也方便恢复现场,你还要了解在出错时如何调试程序,怎么设置和跟踪断点。 其实还有很多可以从中学到的东西,就不一一列举了。你看,简单的爬虫可以引申出这么多开发相关的知识,相比于做教程和课本上那些枯燥的练习,从一开始就通过解决自己的实际需求来学习和精进编程的技艺,无疑是更好的学习方式,这种从需求出发的学习方式,便是我的法宝。

题材可以不限于爬虫,但爬虫确实是一个不错的开始,总之,要精进技艺,你需要练习练习再练习。