时间过的总是那么快,特别是对于一个有拖延症的人来说,例如我...早就想出一个关于爬虫的系列教程,但总是被自己的拖延症和一系列的杂碎事情打断。最近终于将自己的所有事情以及自己最真实的想法捋顺了,所以决定接下来的一段时间里会抽出大量的时间学习巩固更多的爬虫知识并将其书写分享出来,供对爬虫感兴趣或从事相关职业的同胞们学习参考。本人就是一枚从事python开发的程序猿,目前因为个人的私事原因不得不弃业置家,所以有一系列的时间对自己充电(有很多重要知识点都是自己付费搞到手的-_- -_-)。怎么说呢,希望对大家有帮助吧。接下来进入本人的爬虫系列教程(主要以python3为实现语言,特殊情况会说明),希望大家学的开心,不喜路过即可,请轻喷!!!
1、前奏要点
在自己正式开始写爬虫之前,首先我们需要了解爬虫的一些基本知识点,例如http请求原理、网页的基础认知、爬虫的终极原理等,本篇文章我们将主要介绍上述基本知识。
(1) 什么是URL
首先我们先了解一下URL即链接,URL的全称为Uniform Resource Locator,翻译为统一资源定位符。举例来说,https://www.afcentry.cn/是我自己的一个博客网站(建设初期,内容简单,写教程同期丰富建站)的首页链接,它就是一个URL,也是URI(后续补充介绍)。即有这样一个互联网站点资源,我们通过URL/URI来制定了它唯一的访问方式,访问方式内容包括协议类型(http/https),访问的路径等其他内容,通过这个链接我们即可通过各种方式从互联网上访问到这个资源对其进行一系列的下载浏览等骚操作,不管内容是图片、音频、视频还是网页,这就是URL。
(2) 什么是请求
网络请求就是建立在URL的基础之上的,因为所有的网络请求操作必然有一个相关的URL。我们在浏览器上输入一个URL,回车之后便能在窗口界面上查看页面内容。这个过程就是浏览器向我们所输入的URL所在的服务器发送了一个网络请求,网络服务器接收到这个请求之后对其进行处理(用户验证、丰富内容等),然后返回对应的响应,然后传回给浏览器。响应内容包含了页面的源代码等基本内容,浏览器在对其进行解析,最后将网页呈现出来。
对于一个完整的网络请求来讲,必须包含的内容有一下四部分:请求方法、请求的网址(URL)、请求头、请求体。
①请求方法
常见的请求方法有两种:GET、POST。
POST请求就比较复杂一点,它通常和表单一起成套使用,例如常见的登录表单,我们输入账号、密码之后,点击一下登录按钮,这就是发起了一个标准的POST请求。POST和GET请求的主要区别为:
GET的参数均包含在链接里面,如上述举例,我们能看见这个请求的title参数、number参数。而POST的参数则不会包含在链接里面,例如登录,我们自己的登录密码也不可能让他暴露出来,所以采用POST请求方式。
GET请求提交的数据最多只能包含1024个字节,POST方式没有限制。所以又给POST请求方式增加了一个除了登录之外的场景,文件上传,因为文件内容比较大。
上述就是常见的请求方式,与不常见的一起梳理如下:GET请求页面返回页面内容
POST主要用于表单提交或者文件上传,数据包含在请求体中
HEAD类似与GET,但不返回具体内容,主要用于获取报头
PUT从客户端向服务器传送数据取代指定文档中的内容
DELETE请求服务器删除指定内容
CONNECT把服务器当作跳板,让其代替客户端访问其它内容
OPTIONS允许客户端查看服务器的性能
TRACE回显服务器收到的请求,主要用于测试或诊断
②请求链接
请求链接,即URL,它能确定我们要访问的唯一资源。
③请求头
请求头用来说明服务器要使用的附加信息,重要的附加信息主要有cookie、referer、user-agent等,常见的头信息如下:
Accept:请求报头域,用于指定客户端能够接受的信息类型。
Accept-Language:指定客户端可以接受的语言类型。
Accept-Encoding:指定客户端可以接受的内容编码。
Host:指定请求资源的主机和端口号。
Cookie:也常用复数形式Cookies,这是网站为了辨别用户进行会话追踪而存储在用户本地的数据,主要用于维持当前会话。例如登录某网站后,服务器会用会话保存登录状态信息,每次刷新页面的时候站点就不会重复要我们登录。
Referer:表示当前请求是从哪个页面发过来的,应用场景有来源统计、防盗链处理等。
User-Agent:简称UA,服务其通过UA可以识别客户端使用的操作系统及版本、浏览器以及版本等信息,爬虫特别需要此信息,可以伪装成浏览器,避免快速的被系统检测出来。
Content-Type:互联网媒体类型或者MIME类型,主要用于表示具体请求中的媒体类型信息,例如text/html代表html格式,image/gif表示GIF图片。
请求头是爬虫成功与否以及延长存在周期的关键因素。
④请求体
请求体的内容是POST请求中的表单数据,GET请求请求体为空。
请求示例图:
(3) 什么是响应
响应,是由服务器返回给客户端的,它主要由响应状态码、响应头、响应体三部分组成。如下实例图:
①状态码
响应状态码表示服务器的响应状态,在爬虫中主要根据响应状态码来判断服务器的当前状态,确认当前请求成功之后在对其进行进一步的解析处理或者请求失败的重新发起等操作。
常见状态码及其含义
分类 描述
1** 信息。服务器收到请求,请继续执行请求
2** 成功。请求被成功接收并处理
3** 重定向。需要进一步操作来完成请求
4** 客户端错误。无法完成请求,或请求包含语法错误
5** 服务器错误。服务器在处理请求的过程中发成错误
各个状态说明
100继续请求者应当继续提出请求。服务器已收到请求的一部分,正在等待其余部分。
101切换协议请求者已要求服务器切换协议,服务器已确认并准备切换。
200成功服务器已成功处理了请求。
201已创建请求成功并且服务器创建了新的资源。
202已接受服务器已接受请求,但尚未处理。
203非授权信息服务器已成功处理了请求,但返回的信息可能来自另一来源。
204无内容服务器成功处理了请求,但没有返回任何内容。
205重置内容服务器成功处理了请求,内容被重置。
206部分内容服务器成功处理了部分请求。
300多种选择针对请求,服务器可执行多种操作。
301永久移动请求的网页已永久移动到新位置,即永久重定向。
302临时移动请求的网页暂时跳转到其他页面,即暂时重定向。
303查看其他位置如果原来的请求是 POST,重定向目标文档应该通过 GET 提取。
304未修改此次请求返回的网页未修改,继续使用上次的资源。
305使用代理请求者应该使用代理访问该网页。
307临时重定向请求的资源临时从其他位置响应。
400错误请求服务器无法解析该请求。
401未授权请求没有进行身份验证或验证未通过。
403禁止访问服务器拒绝此请求。
404未找到服务器找不到请求的网页。
405方法禁用服务器禁用了请求中指定的方法。
406不接受无法使用请求的内容响应请求的网页。
407需要代理授权请求者需要使用代理授权。
408请求超时服务器请求超时。
409冲突服务器在完成请求时发生冲突。
410已删除请求的资源已永久删除。
411需要有效长度服务器不接受不含有效内容长度标头字段的请求。
412未满足前提条件服务器未满足请求者在请求中设置的其中一个前提条件。
413请求实体过大请求实体过大,超出服务器的处理能力。
414请求 URI 过长请求网址过长,服务器无法处理。
415不支持类型请求的格式不受请求页面的支持。
416请求范围不符页面无法提供请求的范围。
417未满足期望值服务器未满足期望请求标头字段的要求。
500服务器内部错误服务器遇到错误,无法完成请求。
501未实现服务器不具备完成请求的功能。
502错误网关服务器作为网关或代理,从上游服务器收到无效响应。
503服务不可用服务器目前无法使用。
504网关超时服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505HTTP 版本不支持服务器不支持请求中所用的 HTTP 协议版本。
②响应头
请求响应头包含服务器对当前请求的响应信息。
Date:表示响应产生时间。
Last-Modified:请求资源的最后修改时间。
Content-Encoding:响应内容的编码。
Server:包含服务器的信息,例如名称、类型以及版本。
Content-Type:文档类型,指定返回数据的类型。
Set-Cookie:设置Cookies,告诉浏览器下次请求要将此内容放在Cookies中。
Expires:指定响应的过期时间,可使浏览器将加载的内容跟更新到缓存中,下次访问直接从缓存中加载,缩短加载时间。
③响应体
响应中最重要的就是响应体部分。响应的正文数据(爬虫要获取的内容)都存在与响应体中,比如请求网页时,它的响应提就是HTML的源代码,请求图片就是图片的二进制数据。爬虫的解析部分操作对象就是响应体。
2、爬虫原理
常规举例,对于整个互联网而言,我们可以把它比喻成一张big网,爬虫就是行迹在其中的蜘蛛。网的节点就是互联网中的一个个网页,爬虫爬到就相当于访问到了该页面,获取到了其页面数据等内容。网络中节点间的连线就是网页间的链接关系,凭着链接关系,爬虫就可以横行与整个互联网,一个接一个网页的访问,不断的进行数据抓取。
(1) 爬虫简介
爬虫,简单的来说就是模拟人通过浏览器对网站进行访问,但由不同于人的实际访问,它可以快速的根据我们制定的解析规则将我们想要保存的数据进行解析保存。
①获取网页
对于一个爬虫而言,其首先要做的工作就是获取网页,即获取网页的源代码。网页源代码包含了网页的部分有用信息,所以只要把源代码获取下来,我们就可以从代码中提取有用信息了,根据我们上述的前奏要点中介绍的请求和响应,我们向任何网站的服务器发送请求,服务器均会给我们一个响应,其中响应体部分就是请求返回的源代码部分,我们可以通过浏览器中的预览来判断有用数据是否存在来确定爬虫发起哪一个请求。所以,爬虫最关键的部分就是构造请求并发送给服务器,然后接受响应并解析响应体中的源代码,最终得到我们想要的数据。
针对python(个人使用python居多)而言,实现一个简单的爬虫是比较容易的,从发起请求到解析网页获取数据,甚至是存储数据都有现成的可以使用的第三方模块,不用我们重复的造单功能的车轮子。
发起HTTP请求:urllib、requests等模块。
解析网页提取信息:BeautifulSoup、pyquery、lxml等模块。
保存数据:爬虫获取到数据之后我们要进行的操作就是先保存,不管后面怎么使用数据,先不关心,拿到任何东西都先Ctrl+S,是个好习惯。Python保存数据的形式有很多,例如txt文件、json文件、MySQL数据库、Mongo数据库,每一种形式都有对应的操作模块,我们要做的就是熟悉模块准确保存即可,例如保存到MySQL数据库-pymysql。
(2) 爬虫怎么抓数据
在我们访问大网页中,我们能看到各种数据,最常规的也是最简单的就是常规网页,所有数据都存在与HTML代码中,我们要做的就是简单的通过上述的解析模块对html代码进行解析。
当然,有常规的就有不常规的,有简单的就有不简单的。例如有的网页直接返回json字符串(更简单...),对于这种网站,小哥只想说一句,对于爬虫来说这就是做公益。从数据抓取到都是很简单的,后面我们通过实际的站点进行举例说明,大家可以留言想实际操作的网站啊!!!
返回数据类型也是比较多的,除了上述两种还有比较常见的二进制数据,例如图片、视频、音频等。
以上就是爬虫可以抓取的数据范围。
当然了,数据不是你想拿就能拿的,现在很多的网站都做了反爬策略的,常见的例如:利用JS进行数据传输、检测IP访问频率,太频繁直接封IP、各种奇葩的验证码环节,这些才是爬虫要克服的真正难题。针对这些复杂的要解决机制比较复杂的站点爬虫,我们就不能通过常规的请求来解析响应体获取数据了,这样你只会发现,在网页中明明显示的数据,结果源代码中确实一片空白。这个时候就要用到更高级的利器了,例如selenium、ajax接口分析、splash或者是从移动端入手,后面我都会详细介绍实现复杂爬虫并提供源码的,大家开心学习就行了。
温馨提示:文明爬虫,我们不生产数据,我们只是数据的搬运工,请轻拿轻放...
(3) 会话和cookie
在浏览王爷的过程中,我们经常会遇到要登陆的情况,有些页面或数据只能登陆后才能查看,登录之后状态会维持一段时间,短时间之内不需要重复登录,一段时间之后才需要重新登陆。这就是会话(session)、cookies的作用点。
在介绍之前我们需要了解两个简单的概念。静态网页:通过html代码编写,将文字、图片等内容均通过写好的html来指定(说白了就是定死),因为提前指定,所以加载速度会很快写起来也比较简单,不需要其他API来配合。动态网页:与静态网页相对,他的页面数据通过API接口等方式与后台数据库等进行动态关联,内容显示会很灵活,但是---不会让你很容易就拿到数据!!!现在很多网站(几乎90%)都是动态网页来实现数据加载的,session和cookie就是为这类网站而生的。
对于动态网页而言,我既然不想你那么容易就看见数据,所以我肯定会做一个登录页面,或者是登录之后再让你花点儿money冲个会员,岂不妙哉...那随之而来的就是,你登录或者是买会员之后,我不可能只是为了看单一页面的内容,通常都是某类的类容,什么VIP视频等,那我从这个vip视频页面切换到另一个VIP视频页面岂不是要重新登录,这样的话我估计大家都要吐血...这个时候session和cookie就登场了,它要做的就是在客户访问网站并登录之后在一段时间之内记住此用户等登录状态,直到超过服务器设置的超时时限之后再要求你进行重新登录。
Session和cookie的区别就是,session存在与服务端,cookie存在与客户端即用户本地(浏览器),浏览器在下次访问网页时,会自动携带本地cookie将其发送给服务器,服务器通过识别cookies并鉴定出用户关系,判断其是否登录然后做出对应的响应。
针对此,对于那些需要登陆访问数据的网站我们就可以通过cookies来实现了。
①session
Session(会话),其含义就是指一系列的动作语言。例如吃饭、做饭、打电话等,即通过一连串动作、语言等维持的一件事。在web中,会话对象用来存储特定用户会话所需要的属性以及配置等复杂信息。当用户在多个同域的页面之间跳转时,存储在session中的内容将不会丢失,而是在整个用户会话中一直存在。没有就创建,过去就终止或重建。
②cookies
Cookies是指某些网站为了辨别用户身份进行会话跟踪而存储在用户本地的数据。当成功登录某网站之后,服务器会告诉客户端要进行那些cookies信息的设置,并且在后续的访问中需要将cookies发送给服务器,服务器会找到对应的session对其进行判断,以此实现权限管理等操作。
(4) 代理
通过上免得内容我们可以知道,很多站点为了限制我们在网页上的操作,会通过登录的方式对用户进行限制,于此对应的解决方式就是session/cookies。其实这只是单一的限制措施,很可能出现的情况就是你通过一系列的骚操作实现了登录等动作之后,过了一段时间,发现自己的爬虫返回一堆的403...手动打开网页,提示你,‘不好意思哈兄台,你的手速太快,访问频率太高了,您先歇会儿好吧’,你就说气不气吧。这个时候怎么整呢,不要慌,俗话说的好,上有政策,下有对策。这个时候就像前面提到的User-Agent一样,我们伪造一个不就行了么,思路不错,但是IP不能伪造,但是我们可以代理...
①什么是代理
代理值的就是代理服务器,English name is proxy server。它的作用就是代替网络用户去获取网络信息,类似与跳板、中转站。
正常的网络请求是浏览器访问服务器,服务器返回响应。如果使用了代理服务器,那就是在本机和代理服务器之间搭建了一座桥,此时本机不是直接访问web。而是向代理服务器发起请求,然后由代理服务器去请求web,接着代理服务器再把web的返回转发给本机。
②代理的价值
综合上面对代理的介绍我们就能得出代理的作用了,总之就是对爬虫有利(要不然我介绍它干啥),具体作用如下:
首先,突破自身IP访问限制,访问一些平时不能访问的站点(大陆慎行)。
其次,提供访问团体内部资源的权限,例如教育网内代理,可以免费下载对于教育团体开放的大量资源。
第三,提高访问速度,通常代理服务器都设置了一个较大的硬盘缓冲区,当外界有信息要通过时,同时也将其保存到缓冲区,当其他用户访问相同的信息时,则直接从缓冲区获取。
第四,隐藏真实IP,客户可通过代理隐藏自己的真实IP,避开服务方后续相对自己进行的操作,例如封IP。爬虫就是如此。
这是本人爬虫系列的开篇,不管内容如何,均由本人逐字逐句敲键盘原创生成,不喜轻喷,更多原创内容可访问https://www.afcentry.cn/。