网络爬虫的原理
优采云 发布时间: 2020-05-18 08:02互联网上,公开数据(各种网页)都是以http(或加密的http即https)协议传输的。所以,我们这儿介绍的爬虫技术都是基于http(https)协议的爬虫。
在Python的模块海洋里,支持http合同的模块是相当丰富的,既有官方的urllib,也有大名鼎鼎的社区(第三方)模块 requests。它们都挺好的封装了http合同恳求的各类方式,因此,我们只须要熟悉这种模块的用法,不再进一步讨论http合同本身。
大家对浏览器应当一点都不陌生,可以说,只要上过网的人都晓得浏览器。可是,明白浏览器各类原理的人可不一定多。
作为要开发爬虫的小伙伴网络爬虫原理,是一定一定要明白浏览器的工作原理的。这是你写爬虫的必备工具,别无他。
大家在笔试的时侯,有没有遇见如此一个特别宏观而又处处细节的解答题:
这真是一个考验知识面的题啊,经验老道的老猿既可以滔滔不绝的讲上三天三夜,也可以提炼出几分钟的精华讲个大约。大家似乎对整个过程就一知半解了。
巧的是,对这个问题理解的越透彻,越对写爬虫有帮助。换句话说,爬虫是一个考验综合技能的领域。那么,大家打算好迎接这个综合技能挑战了吗?
废话不多说,我们就从解答这个题目开始,认识浏览器和服务器,看看这中间有什么知识是爬虫要用到的。
前面也说过,这个问题可以讲上三天三夜,但我们没那么多时间,其中一些细节就略过,把大致流程结合爬虫讲一讲,分成三部份:
浏览器发出恳求服务器作出响应浏览器接收响应
在浏览器地址栏输入网址后回车,浏览器请服务器提出网页恳求,也就是告诉服务器,我要看你的某个网页。 上面短短一句话,蕴藏了无数玄机啊,让我不得不费点口舌一一道来。主要述说:
首先,浏览器要判定你输入的网址(URL)是否合法有效。对应URL网络爬虫原理,小猿们并不陌生吧,以http(s)开头的那一长串的字符,但是你晓得它还可以以ftp, mailto, file, data, irc开头吗?下面是它最完整的句型格式:
URI = scheme:[//authority]path[?query][#fragment]
# 其中, authority 又是这样的:
authority = [userinfo@]host[:port]
# userinfo可以同时包含user name和password,以:分割
userinfo = [user_name:password]
用图更形象的表现处理就是这样的:
经验之谈:要判定URL的合法性
Python上面可以用urllib.parse来进行URL的各类操作
In [1]: import urllib.parse
In [2]: url = 'http://dachong:the_password@www.yuanrenxue.com/user/info?page=2'
In [3]: zz = urllib.parse.urlparse(url)
Out[4]: ParseResult(scheme='http', netloc='dachong:the_password@www.yuanrenxue.com', path='/user/info', params='', query='page=2', fragment='')
我们看见,urlparse函数把URL剖析成了6部分: scheme://netloc/path;params?query#fragment 需要主要的是 netloc 并不等同于 URL 语法定义中的host
上面URL定义中的host,就是互联网上的一台服务器,它可以是一个IP地址,但一般是我们所说的域名。域名通过DNS绑定到一个(或多个)IP地址上。浏览器要访问某个域名的网站就要先通过DNS服务器解析域名,得到真实的IP地址。 这里的域名解析通常是由操作系统完成的,爬虫不需要关心。然而,当你写一个小型爬虫,像Google、百度搜索引擎那样的爬虫的时侯,效率显得太主要,爬虫就要维护自己的DNS缓存。 老猿经验:大型爬虫要维护自己的DNS缓存
浏览器获得了网站服务器的IP地址,就可以向服务器发送恳求了。这个恳求就是遵守http合同的。写爬虫须要关心的就是http合同的headers,下面是访问 en.wikipedia.org/wiki/URL 时浏览器发送的恳求 headers:
可能早已从图中看下来些疲态,发送的http请求头是类似一个字典的结构:
path: 访问的网站的路径scheme: 请求的合同类型,这里是httpsaccept: 能够接受的回应内容类型(Content-Types)accept-encoding: 能够接受的编码方法列表accept-language: 能够接受的回应内容的自然语言列表cache-control: 指定在此次的请求/响应链中的所有缓存机制 都必须 遵守的指令cookie: 之前由服务器通过 Set- Cookie发送的一个 超文本传输协议Cookie 这是爬虫太关心的一个东东,登录信息都在这里。upgrade-insecuree-requests: 非标准恳求数组,可忽视之。user-agent: 浏览器身分标示
这也是爬虫太关心的部份。比如,你须要得到手机版页面,就要设置浏览器身分标示为手机浏览器的user-agent。
经验之谈: 通过设置headers跟服务器沟通
如果我们在浏览器地址栏输入一个网页网址(不是文件下载地址),回车后,很快就听到了一个网页,里面包含排版文字、图片、视频等数据,是一个丰富内容格式的页面。然而,我通过浏览器查看源代码,看到的却是一对文本格式的html代码。
没错,就是一堆的代码,却使浏览器给渲染成了漂亮的网页。这对代码上面有:
而我们想要爬取的信息就藏在html代码中,我们可以通过解析方式提取其中我们想要的内容。如果html代码上面没有我们想要的数据,但是在网页上面却看见了,那就是浏览器通过ajax恳求异步加载(偷偷下载)了那部份数据。