爬虫方向的知识是十分碎片化的,我们在写爬虫针对的各种各样的网站,每个网站用到的反爬技术可能都不一样,所以我们面对不同的网站要有不同的解决方案。
首先我们来聊聊为什么要学习爬虫?
大家都知道我们现在是大数据的时代,那大家有没有想过我们的数据从那里来的?
数据的来源有很多种方式,我们仅讨论几种常见的方式
- 企业本身用户生产的数据
- 政府/机构提供的公开的数据
- 第三方数据平台购买的数据
- 爬虫获取到的数据
前面3种方式,跟爬虫的关系并不大,我们不展开讨论,最后一条就是我们为什么要学习爬虫的原因了。而且爬虫获取到的数据,还可以有更大的用途,比如给一些算法提供数据。
聊完为什么要学习爬虫,那有的宝就要问了,我听说go、易语言、都能做爬虫,为什么要选择用Python来做爬虫呢?
原因有以下几点:
- 代码简介,开发效率高
- 支持的模块多
- HTTP请求和HTML解析的模块丰富
- 调用其他接口也非常方便。
爬虫的概念
每个人对爬虫的理解不一样,所以概念大家不用过多的纠结,网络爬虫就是模拟客户端(主要指浏览器)发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
这里很多刚刚开始接触爬虫的小可爱们,老是被网上的小视频忽悠,觉得爬虫跟黑客一样,无所不能。
这里我要澄清一下
- 只要是浏览器能做的事情,原则上,爬虫都能够做
- 爬虫也只能获取客户端所展示出来的数据!!!!!
尤其是第二点,爬虫不能爬人家的聊天记录啊,我的宝~~, 也不能给你定位你的女朋友位置啊,更不能窃取人家的隐私啊
爬虫的更多用途
当然爬虫除了可以获取到数据之外,确实可以做一些其他的事情。
比如软件测试,爬虫中会用到selenium模块,这个东东可以用在自动化测试当中,还有appium也可以用到移动端的测试中。
还有一些抢票和投票的网站,也可以用爬虫来做点事情,手动狗头保命!
在一些网络安全中,偶尔也会用到爬虫
爬虫是怎么抓取网页的数据
首要就要聊到网页三大特征:
- 1 网页都有自己唯一的URL
- 2 网页都是HTML来描述页面信息
- 3 网页都使用HTTP/HTTPS协议来传输HTML数据
爬虫的设计思路:
- 1 确定需要爬取的URL地址
- 2 通过HTTP/HTTPS协议获取对应的HTML页面
- 3 提取HTML页面有用的数据
爬虫的分类
根据使用场景,网络爬虫可分为通用爬虫和聚焦爬虫两种
- 通用网络爬虫 是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
- 聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于: 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
根据是否以获取数据为目的,可以分为功能性爬虫和数据增量爬虫
- 功能性爬虫,在网站上投票,点赞
- 数据增量爬虫,比如招聘信息
HTTP和HTTPS
在正式开始学习爬虫之前,我们先来了解一下HTTP和HTTPS协议,这里我们只站在爬虫的角度去了解这两个协议。
先来聊聊什么是协议,协议就是双方共同遵守的一组约定,只有大家都遵守这个约定,我们才可以玩下去。举个例子,你和老外沟通大家要么都说英文,要不都说汉语,不然一个英文一个汉语,你俩是没有办法沟通的。计算机的通信也是一样的。
HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入SSL层
SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络连接进行加密,保障在Internet上数据传输的安全
- HTTP的端口号为80
- HTTPS的端口号为443
HTTPS比HTTP更安全,但是性能更低
HTTP的请求与响应
HTTP通信由两部分组成: 客户端请求消息 与 服务器响应消息
1.当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向服务器发送HTTP请求。HTTP请求主要分为Get
和Post
两种方法。
2.当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个请求去获取 http://www.baidu.com 的html文件,服务器把文件对象发送回给浏览器。
3.浏览器分析服务器返回的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送去获取图片,CSS文件,或者JS文件。
4.当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
在来看下我们最熟悉的网址,URL:统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
基本格式:scheme://host[:port#]/path/…/[?query-string][#anchor]
- scheme:协议(例如:http, https, ftp)
- host:服务器的IP地址或者域名
- port#:服务器的端口(如果是走协议默认端口,缺省端口80)
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置) 不影响当前的请求
客户端HTTP请求
URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
请求行、请求头部、空行、请求数据
四个部分组成,下图给出了请求报文的一般格式。
HTTP请求示例,可以在浏览器中打开F12,在Request Header中点击View source
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: same-origin
Referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=Python
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=4049831E3DB8DE890DFFCA6103FF02C1;
请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP 0.9:只有基本的文本 GET 功能。
HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP 1.1:在 1.0 基础上进行更新,新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为 :method、:scheme、:host、:path这些键值对。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
常用的请求报头
我这里只给大家提一些常用的,更多的请求头大家可以自行百度
1.Host (主机和端口号)
Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。
2.Upgrade-Insecure-Requests (升级为HTTPS请求)
Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
3.User-Agent (浏览器名称) User-Agent:是客户浏览器的名称
4.Referer (页面跳转处)
Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。
5.Cookie (Cookie) Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能
服务端HTTP响应
HTTP响应也由四个部分组成,分别是: 状态行、消息报头、空行、响应正文
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xdbeb11ea000cfef4
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+642857607c537ed21fa04bcfb54ff6ee
Date: Thu, 02 Jan 2020 06:32:55 GMT
Expires: Thu, 02 Jan 2020 06:32:51 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=6; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1448_21096_30210_30283_30504; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1577946775028760116215846779410554093300
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
响应状态码
响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
常见状态码:
- 100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
- 200~299:表示服务器成功接收请求并已完成整个处理过程。常用200(OK 请求成功)。
- 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
- 400~499:客户端的请求有错误,常用404(服务器无法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
- 500~599:服务器端出现错误,常用500(请求未完成。服务器遇到不可预知的情况)。
重点的状态码
- 200 成功
- 302 临时重定向
- 307 永久重定向
- 404 not found
- 500 服务器内部错误