一、定义及分类
开宗明义,什么是爬虫?
网络爬虫(web crawler,又称为网页蜘蛛,网络机器人)是一种按照一定的规则,自动地向网站发出请求并获取响应后解析并保存所需数据的程序或者脚本,被广泛用于搜索引擎、信息汇总站和各种自动化程序脚本。
按照系统结构和实现技术,网络爬虫大致可以分为以下几种常见类型:
1.通用网络爬虫(General Purpose Web Crawler)
其爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎(如百度)、网页快照(如互联网档案馆)、大型 Web 服务提供商(如淘宝等软件内搜索)等采集数据。 其爬行范围和数据量大,对性能要求较高。
2.聚焦网络爬虫(Focused Web Crawler)
是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。相比于通用爬虫,其可对特定网站的特定内容进行爬取,功能灵活,是我们个人最常用的一种。(像短视频平台上那种展示爬虫的视频大多属于这种)
3.增量式网络爬虫(Incremental Web Crawler)
相比于聚焦爬虫,增量式爬虫采取增量式更新,只爬取新产生的数据,有效减少了网络和空间需求。
二、Robots协议
对搜索引擎或建站有一定了解的人可能对robots.txt(均为小写字母)这个文件感到熟悉。
robots.txt是一种通常放在网站根目录的一个文件,其按照一定语法规则(如Allow和Disallow)来告知搜索引擎该网站中哪些目录、文件是可以/不可以被哪一种爬虫抓取的,从而可以防止爬虫(特别是通用爬虫)爬取网站或个人隐私文件等内容或便于针对特定搜索引擎进行SEO优化。
需要注意,robots.txt协议并不是一个规范,而只是约定俗成的君子协议,所以并不能保证网站的隐私。
以下是百度(https://www.baidu.com/robots.txt)的robots.txt(部分)
三、爬虫的基本流程
回顾一下前面的定义
网络爬虫是一种按照一定的规则,自动地向网站发出请求并获取响应后解析并保存所需数据的程序或者脚本。
参考定义,可以简单归纳出爬虫的运行步骤:
-
按照一定规则向网站发出请求(Request)
通过编程语言自带库/第三方库向目标以一定方式(如GET,POST)向网站发出特定数据包(由请求头和请求体组成)请求服务器回应。
-
按照一定规则获取响应(Response)
“响应”指服务器收到请求后返回的内容,由响应状态(通常为3位特定数字),响应头和响应体(其形式包括HTML,字符串或二进制文件等)组成。
-
按照一定规则解析响应内容
解析方式包括但不限于网页解析库(如Python中的BuautifulSoup4),JSON解析库,正则表达式等。
-
按照一定规则保存数据
保存形式不一,取决于数据类型,常见形式有文本,数据库或二进制文件。
四、了解Request和Response
不难发现,整个爬虫最重要的部分在于目标网站的请求(Request)和响应(Response)。能否正确向网站发出请求和正确获得响应就是学习爬虫的必备技能。以下是一些相关介绍
请求方式
最常见的请求方式有GET和POST。
GET方式请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,以&连接多个参数(如https://www.baidu.com/s?ie=UTF-8&wd=get),传递参数长度受限制。POST方法是把提交的数据放在HTTP包的请求体(Body)中,对数据大小无限制。
另外还有HEAD/PUT/DELETE/OPTIONS等等其他方式。
请求头
介绍几个请求头中的常见参数:
User-Agent:用户代理,使服务器可以识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Cookie:服务器用于辨别用户身份(“证明你是你而不是别人”)的特定文本。
Referer:标识链接来源,用于防盗链,防止恶意请求或反爬虫。
响应状态
状态码的职责为向用户返回本次请求的结果,由3位数字及原因短语组成(如200 OK)
状态码第一位数字为响应类型,有以下5种:
1XX Informational(信息性状态码)
2XX Success(成功状态码)
3XX Redirection(重定向状态码)
4XX Client Error(客户端错误状态码)
5XX Server Error(服务器错误状态码)
以下是几个常见状态码及含义
200 OK 从客户端发来的请求在服务器端被正常处理了。
301 Moved Permanently 永久性重定向 请求的资源已经被分配了新的URI
302 Found 临时性重定向 请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 发送的请求需要有通过HTTP认证的认证信息或用户认证失败
403 Forbidden 对请求资源的访问被服务器拒绝(通常为未登录/请求未携带Cookie/没有权限访问)
404 Not Found 服务器上无法找到请求的资源
500 Internal Server Error 服务器端在执行请求时发生了错误
502 Bad Gateway 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关
503 Service Unavailable 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求