![94ac87b440a5f49f0b6816943242351d.png](https://i-blog.csdnimg.cn/blog_migrate/422293d8a5be005ff22662697480742a.jpeg)
1,一个问题就是,爬虫是一个什么东西?为什么需要爬虫?
说白了,爬虫就是一个“机器人”。平常,我们从浏览器浏览网站,我们必须一页一页的打开,然后找到我们需要的内容。如果我们想保存网页中内容的话,也只有一页一页的浏览,然后Ctrl+C,再然后Ctrl+V。这样效率就特别慢,如果我们需要下载的东西有几百万的话,这是根本无法完成的了。
怎么办呢?我们能够想到的一个方法,就是,如果我们有一个机器人,伪装成一个浏览器,然后按照我们设定的规则,自动的打开网页,然后自动找到我们的内容,再然后自动的下载保存起来,那么不就OK了?是的,爬虫就是这么干的。
为什么需要那么变态的爬取那么多别人的内容?因为数据,现在是大数据和AI时代,如果做好AI,必须有足够的数据,当然,找到这些数据最好的方法就是采集已有的数据。
2,开发爬虫需要的预备知识
因此,如果你想写爬虫,你首先要对浏览器和服务器的原理要搞懂,否则,你怎么能够模拟一个浏览器机器人的?简单的说,浏览器,就是根据用户的操作,发送一个Request给服务器,服务器接收到这个Request,然后做一个处理,然后把处理的结果Response返回给浏览器,然后浏览器解析和渲染这个Response,呈现用户可见的图形或者文字。
上面只是简单的说,真正展开了,这里的细节非常的多。这么多的工作,就是现在各种网络开发工程师,例如前端工程师和后端工程师等一直在煎熬的事情。
爬虫要做的事情基本就是下面几个:
第一,构造request,然后发送给服务器。
第二,接受到respone,然后解析response,找到自己需要的内容
第三,其它就是一些辅助功能,例如保持数据,保存到数据库等等
嗯,看起来好像非常简单。
3,为什么选择python,框架Scrapy是个什么东西?
我们准备做一个项目,都面临一个语言选择的问题,语言选择一般遵循两种原则:
第一,性能要求,这个是最基本的要求
第二,开发的方便性,这个问题,取决于相关语言提供的内置或者外置的库的多少。
所以,如果就写爬虫而言,python其实并不是唯一的选择,例如C或者Java都可以完成,但是Python却是一个最优的选择,因为很多人都在使用Python做爬虫,也贡献了非常多的爬虫相关的框架和模块。因此,如果你不想重复造轮子的话,使用Python做爬虫是一个非常不错的选择。
框架是一个什么玩意?
如果不是几十年前的老工程师,估计都或多或少的接触框架,php、js、javaEE,等等对于开发网站等经常需要处理的工作,都会有很多流行的框架。所谓的框架,就是把很多工作进行流程化,然后让你需要自己定制的地方去定制,其它工作,框架都帮你写了,你不需要重复写那些所有人都需要写的部分了。就像盖房子,别人把土木,水电,安全等等全部给你搞定了,你所需要做的,就是定制你自己的厨房卫生间卧室等工作而已。Scrapy就是一个爬虫的框架,他把很多流程都固化了,你只要提供你所需要爬的网站地址,然后,就可以拿到respone,分析resopne,怎么保存数据等等,全部帮你搞好框架。
如果没有框架呢?你需要负责跟踪请求和反馈的错综复杂的来往,你不花费巨大的精力和智力,可能无法写一个性能优良的服务前后端程序。
框架就是这样的东西,规范工作流程,不容易犯错误,常用的代码都帮你写好了。
4,深入了解网络请求
开发爬虫的第一步,就是写所谓的请求,也就是就是构造一个类似于浏览器的数据,按照同样的方法发送给服务器,然后就等待接收服务器的返回了。几个问题需要明确:
第一,浏览器有哪些地方会发送请求?
第二,浏览器发送的数据有多少种,格式是什么样子?
关于第一个问题,浏览器有如下几个地方会发送请求:
1)地址栏,这个不要多说了。
2)form表单,就是网页上那种输入账号和密码的那种东西。
3)js语言,其中最著名的就是ajax。
关于第二个问题:
现在浏览器使用RESTful格式的请求,其实就是对于uri的增删改查操作,但是我们一般使用的还是GET和POST的方式最大。get最典型的就是浏览器地址栏发送的请求,而POST典型的就是form表单,而ajax对于GET和POST都有使用。
5,如何解析服务器返回的数据?
获取到response之后,我们接下来的重要任务就是分析其返回的内容了,response主要内容包括html网页(含js代码)和json数据两种类型。
对于html网页,其实非常复杂的,我们怎样从这样复杂的字符串流中找到我们感兴趣的内容呢?我们一般对其中内容文本、图片或者视频,或者引导到另外一个地址的网页链接等感兴趣。怎么找呢?
第一种方法,使用正则的方法,自己从中找到自己感兴趣的内容。哈哈,这很难的。
第二种方法,使用一个第三方工具,所谓的BeautifulSoup,这个工具在使用第三方分析器,把html转化成python的结构化数据,然后,我们可以使用数据结构的导航方法,找到我们感兴趣的内容。
第三种方法,就是直接使用xpath和jsonpath来直接分析返回的html和json数据。
6,js代码怎么处理?
现在浏览器,其实更像一个虚拟的操作系统+CPU,可以执行复杂的js指令。而上面讨论的request和response,都是假定了静态网页的方式,而实际应用中的网页,纯粹静态的很少,更多是动态网页,也就是网页中有交互的js代码,这个js代码根据实际情况,而产生和服务器的交互,决定继续从服务器加载需要的内容。
因此,我们需要模拟js执行的情况,这是一个比较大的问题,chrome的独占鳌头,就是因为它优化了js的执行问题。因此,我们能否直接操纵浏览器,例如chrome来帮我们加载动态页面呢?非常幸运,这个方法是有的,这是从网站自动化测试需求的一个东西,就是所谓的selenium。python支持这个。
python通过安装selenium,然后通过一个浏览器的驱动程序webdriver,进而控制浏览器。
7,爬虫和黑客什么区别和联系?以及爬虫未来的展望
总之,我们通过各种手段,伪造好像真人从服务器去拿数据,但是,很多网站也有使用很多方法去鉴别你是通过爬虫拿数据的,从而不给你数据,或者杀掉你的IP。所以,爬虫开发和反爬虫开发,就像小偷和警察一样的发展。
另外,爬虫开发和黑客什么关系?因为我们的目的是不择手段的去拿去数据,往往也走在了黑客的边缘,因为我们在分析网站的时候,往往会发现网站的漏洞,只是我们不去黑掉网站而已。这也说明了,如果你是一个资深黑客,一定对你开发爬虫有很大的帮助。
可以简单的展望,现在AI这么发达,未来我们其实完全没有必要开发复杂的爬虫,仅仅开发一个AI机器人,模拟人类的操作和保存数据(Ctrl+C和Ctrl+P),这样就行了。估计这样的机器人对于后台反扒工程师,估计更难分辨了。