首页 > Python基础教程 >
-
DotNet应用之爬虫入门系列(一):从.Net走进爬虫世界
前言
人类从21世纪还未开始的时候,就进入了“信息大爆炸”的时代。丰富的信息让人眼花缭乱的同时,信息的获取和检索又成了重大难题。想想以前刚认字的时候,你需要买一本字典,按照拼音或者笔画去检索,最终获取你想要查阅的汉字。如今信息的数量级和时效性,已经不是那几千几万个汉字所能匹敌,也不是一本厚厚的字典就能包容得下的。所以,今天查字典已经不再是大多数人的第一选择,而搜索引擎则成为了信息获取领域当之无愧的霸主。从你点击搜索按钮的一瞬间,在1s内浏览器就会为你呈现关键词搜索的网页结果,其中涉及了太多的互联网技术,让人感叹科技发展的日新月异。而网络爬虫技术,正是搜索引擎的基础技术之一。
什么是网络爬虫
宽泛地说,所有“自动化”获取信息的技术,都是爬虫技术的一部分。比如使用按键精灵自动翻页,甚至使用机械臂去模拟键盘、鼠标的点击,其实都可以理解为是一种爬虫技术。但一般来说,爬虫界的主体还是依赖于互联网和程序本身,其主要对象是网页和日益流行的App,主要手段则是通过模拟浏览器或客户端的访问来自动化获取信息。搜索引擎正是非常典型的网页爬虫应用,它通过爬虫技术来获取各个网站的信息,再通过复杂的分类、检索算法和分布式存储,让原本爆炸的信息可以以一种相对有条理的面貌呈现到用户眼前。我们可以狭义地认为,互联网和爬虫是唇齿相依的。
爬虫技术门槛如何
很低。往往谈某领域入门很容易,都可能会让该领域老手们觉得受到了侮辱。但细想来,大可不必。比如.Net平台的亲儿子语言C#,公认的好学易上手,还因为是当年语言界当之无愧的“拖控件之王”被黑至今,可谓门槛低到让一些人看不起。然而事实上是,它的学习曲线其实很陡峭,当你用它去做越高级、越复杂的项目,宏观上涉及到超脱语言的概念越多、微观上涉及到底层的细节越多。爬虫亦是如此。
当然,我应当在此定义一下我心中的爬虫入门标准,尽管肯定会有争议,但并不妨碍技术上的交流。我心中的爬虫入门标准是:可以独立完成一个简单的、完整的网页爬虫程序。
而完整的爬虫程序包括:
- 对方网站的各种请求参数;
- 程序获取正确响应的手段;
- 从响应文本提取所需信息的手段;
- 持久化存储的手段。
这也基本对应了爬虫程序编写工作的流程:
- 查看对方网站,分析获取所需信息的请求及参数;
- 编写程序模拟浏览器请求获取正确、有效的响应;
- 编写从字符串文本到实体化对象的逻辑代码(可以跟2互换顺序);
- 数据持久化(对接数据库等)。
相对应地,所需要的技术基础如下:
- 学习如何查看浏览器和网站之间互动的请求,包括学习使用浏览器调试工具、学习诸如Fiddler或Charles等抓包工具;掌握Http/Https基础知识;
- 掌握一门编程语言;掌握该平台上自带或第三方提供的Http工具库;
- 了解Json、Html的相关知识;掌握该平台上自带或第三方提供的文本解析库;
- 了解数据库知识;掌握该平台上自带或第三方提供的数据存储库。
这些技术基础,对大部分入门新手来说,好像看上去很多的样子,容易产生畏难情绪。但其实最重要和优先的,是“学习分析请求”和“掌握一门编程语言”;其他的从陌生到初步了解,基本上就一两天的工夫。更需要提醒的是,这些技术不是网络爬虫的专属技术,而是适用性非常广泛的“主流知识”,行业必备,学习的性价比无敌。
既然爬虫门槛这么低,适不适合我
这是一个非常严肃的话题。因为爬虫门槛较低,很多人并非把它当作主业,写爬虫往往是因为工作上某个临时任务、生活中想薅个羊毛、帮朋友写个工具等等。这时候爬虫通常是小规模的,对象往往是单个网站,数据量、请求量也是非常小的,对程序的运行效率、代码的可维护性要求都是随心的;而专门的爬虫岗位则会更具有挑战性——
- 可能需要从多个网站、多个网页获取所需数据并整合,爬取的逻辑和过程会更加复杂;
- 爬取对象可能具有很强的反爬手段;
- 所需数据的体量可能都是按十万、百万、千万、亿计,相应的请求量也可能会榨干网络带宽;
- 数据可能具有较强的时效性,对程序获取数据的效率有较高的要求;
- 较大的数据量、较快的爬取速度,相应地对数据存储的要求也提高了;
- 对代码的可维护性有一定的要求。
当爬虫成为专门的岗位时,那么入门的那些知识,就只是冰山一角了(本系列由于是入门向,不会过多涉猎非基础的知识,具体的还需要读者遇到了再自行学习)。所以,判断自己适不适合做一名爬虫工程师,我个人认为有以下三点思考可供读者参阅:
- 我喜不喜欢“多选项”开发?爬虫业务的需求通常就是数据的获取和处理,但业务不会告诉你怎么获取,你可以选择PC端网页、也可以选择移动端,或者App,或者其他途径。一切由你自己决定,没有对和错,只有好与更好。在获取最终结果之前,一切都是不确定,你不得不一直寻找路径,各种尝试,直到成功、放弃或者……跑路(手动滑稽)。
- 我喜不喜欢“被动式”开发?如果对方网站一直不变化,爬虫程序一直有效,那么很少会有业务上的更改,爬虫岗位会非常的轻松愉快。但事与愿违,爬和反爬永远都是欢喜冤家。你可能辛辛苦苦写好了爬虫程序,还沾沾自喜自己代码写得有条有理,结果第二天就发现对方网站修改了反爬策略——得,继续顶着业务节点压力改代码,互相伤害呗。你需要有“与人斗,其乐无穷”的觉悟,这是一个真正的爬虫爱好者所必备的觉悟。
- 我喜不喜欢“被动式”学习?这是爬虫岗位对从业者最高的要求。随着浏览器性能的提高、前端技术的发展以及人工智能的应用,反爬虫技术近年来发展迅速,双方的力量彼消此涨,爬虫技术迎来了更大的挑战。你可能需要像前端一样了解Javascript、了解浏览器底层,需要像安卓工程师一样了解安卓平台,需要像逆向工程师一样了解反编译……这才是爬虫技术的内核——破解、对抗。我曾看过这么一句话:“爬虫的最高境界就是,所见即所得”。而为了达到这一境界,你所需涉猎的,肯定会横跨多个平台、多个技术领域,且深度至少要达到该平台、领域的平均水平。而最关键的是,这些当中的绝大部分,应该都不是你当初刚入行时就能想得到去接触去学习的,甚至有些是你知道了也没有兴趣的,所以我称之为“被动式”学习。到了这时候,如果你还是觉得爬虫很有趣,依然热爱这个岗位,不用多说了,你就是爬虫界的“天选之人”。
如果前两个问题你就开始犹豫了,我不建议你把爬虫当作主业。而如果三个问题都是“YES”,那么赶紧学起来吧,相信爬虫技术给你带来的待遇回报、成就感和快乐,一定会对得起你的付出(记得到时候多写写技术文章,让我涨涨姿势)。
教练,我想写爬虫!用什么编程语言合适
上面也提到过,其实爬虫技术的核心并不是用什么语言、库,而是“破解、对抗”的技术。那么语言的意义在哪儿呢?为什么有人要写什么爬虫框架?答案是——
它们能保证你用20%的精力就可以做出爬虫程序80%的部分,让你可以把更多的心思放在破解、对抗上。
一个爬虫程序往往只有20%的代码,是真正核心的部分,是你花了80%的精力去探索、去思考得来的解决方案。剩下的80%,基本不是爬虫技术的专属模块,而是通用技术的一部分,例如:
- 优秀的编程环境
- 优秀的多线程/并行支持
- 优秀的异步编程体验
- 优秀的网络编程体验
- 优秀的Json/Html序列化支持
- 丰富的加解密等各类算法库
- 良好的社区支持
- ……
所以,选择一门合适的编程语言,可以让爬虫开发轻松,代码优雅,程序运行高效。目前来看,Python似乎已经成了爬虫界的主流,到处都能看到“学Python走向爬虫/大数据工程师”的培训广告,亦或者《使用Python写一个xx网站爬虫》的文章。我无意引入语言之争,Python这么流行,自有它的优点,易学易上手,且有丰富的HTTP库支持和良好的社区支持等等。但这不代表它一定就是写爬虫的最佳之选;或者说,写爬虫还可以有其他优秀的语言可供选择,比如本文推荐的C#。
C#一直是.Net平台的第一语言(俗称微软“亲儿子”语言),它不但具有上述各项优秀的支持和体验(尤其是多线程/并行/异步编程支持),而且还一直发展自己的语言特性(随着.Net Core 3.0的临近,C#也即将发布8.0的新特性,结合“宇宙第一IDE”的Visual Studio,将带来更美妙的编程体验哟!——本条$5,希望微软尽快打钱到我账上)。另外,这些年来.Net Core平台的发展和优化,丰富了.Net自带的类库和API,也使得.Net开发程序的性能也有了极大的提高。由C#入坑爬虫的另一个好处是,以后有空可以去学习.Net能做的一切,桌面开发、网站开发、移动端开发……是的,天地很大,看你造化。
说回正题,在编写爬虫程序方面,选择哪一门合适的编程语言见仁见智(还有Java/Go等等,我感觉这方面说多了容易引战啊,还是扣题为妙),所以编程语言上的推荐到此为止。而笔者认为,对C#这门优秀的静态编程语言来说,写爬虫实乃“张飞耍扛子——轻而易举”。如题,接下来本系列的文章,我将使用C#带领读者们“从.Net走进爬虫世界”,下期见^.^!