学习爬虫前你需要知道这些
I. 什么是爬虫?
爬虫的概念
爬虫是模仿用户在网页的操作,以完成一些数据量较大的访问或爬取工作。小则爬取图片、视频,大则爬取图片库,甚至爬取整个网站
更加专业和全面的定义是:伪装成**客户端(Client)的网络爬虫与服务端(Server)**进行数据交互。
请求与响应
在用户访问网站时,会通过浏览器发出请求,然后再获取响应信息,进而得到一个完整的网页界面,基本原理如下图:
-
**请求(Request):**包含了请求信息的HTTP报文,由客户端发送给服务端
-
**响应(Response)?*包含了响应信息的HTTP报文,由服务端发送给客户端
举个?
以下是用户访问百度时客户端和服务器作出的操作:
- 用户访问网址www.baidu.com, 客户端(即浏览器)会构造请求并发送给百度服务器
- 服务器接收到请求后, 分析出请求的目的:
获取百度首页页面
, 接着构造响应并返回给客户端 - 客户端接收到响应, 对其中的数据资源进行加载和渲染, 将结果(即百度首页)呈现给用户
参考理论
II. robots协议
在爬取某个网站时要尽量遵循该协议,查看协议的方法,例如百度:https://www.baidu.com/robots.txt
在这个文件中声明该网站中不想被蜘蛛访问的部分,这样,该网站的部分或全部内容就可以不被搜索引擎访问和收录了,或者可以通过robots.txt指定使搜索引擎只收录指定的内容
III. HTTP和HTTPS
HTTP协议
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
通过TCP/IP通信协议来在Client和Server之间建座桥,HTTP请求和响应就在这座桥上传递.,请求和响应中包含着相关信息
HTTP请求流程
一次http请求的基本流程是:
- 客户端向服务端发起一次请求(request)
- 服务器在接收到以后返回给客户端一个响应(response)
所以一次完整的http请求包含请求和响应两部分。
HTTP服务器默认监听80端口
HTTPS协议
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版
http协议是基于TCP/IP通信协议的,而https是在http协议的基础之上,再加了一层SSL/TLS协议,数据在传输过程中是加密的。
HTTPS协议的默认端口是443
HTTP和HTTPS的区别
https://blog.csdn.net/xiaoming100001/article/details/81109617
简单来说, HTTP和HTTPS的区别主要有两点:
- HTTP默认端口是80,而HTTPS默认端口是443
- HTTP是明文传输, HTTPS是采用SSL/TLS加密传输, 会比较安全
HTTP协议的特点
HTTP三个特点:
- HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
IIII. URL
发送http请求时,通过url对网络资源进行定位。
URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址。也即是我们常说的网址。以下面这个URL为例,介绍下普通URL的各部分组成:
V. 请求
HTTP请求报文
客户端发送一个HTTP Request到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据。
http报文的结构,请参考http://www.runoob.com/http/http-messages.html
\n是换行,英文是New line。\r是回车,英文是Carriage return
HTTP请求方法
GET
该方法主要是用来获取数据,一般不涉及修改服务器中的数据,比如查看图片或者网站页面
get方法携带的参数会直接展示在url中
POST
该方法相对GET方法要安全一点,用来提交相关数据到服务器,比如提交用户登录数据修改用户密码,修改相关信息等操作
post方法携带的参数是通过后端提交的,不会展示在url中
更多请求方法:
友情链接:http://www.runoob.com/http/http-methods.html
HTTP请求头
友情链接:https://www.cnblogs.com/printN/p/6534529.html
HTTP请求正文
请求正文通常是使用POST方法进行发送的数据,GET方法是没有请求正文的。
请求正文跟上面的消息报头由一个空行隔开。
VI. 响应
HTTP响应报文
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。参考响应报文格式
需要注意的是响应报头中的Content-length是以字节单位计算的
HTTP响应状态码
当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码。
HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者据徐执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
更多响应码信息请参考http://www.runoob.com/http/http-status-codes.html
HTTP响应报头
请参考:http://www.runoob.com/http/http-header-fields.html
VII. Cookie
http cookie 详情:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies
HTTP是无状态的,协议本身不涉及保存访问记录, 也就是请求和响应过程中不保存相关记录信息, 这样的特性会造成两个现状:
- 基于HTTP实现的应用在数据交互时, 交互速度比较快
- 由于不记录信息, 服务器无法区分访问自己的客户端.
举个例子: A是客户端, B是服务端, 进行两次交互.
第一次交互:
A: 嗨, 我叫张三, 你叫什么名字呢?
B: 你好, 我的名字是李四.
第二次交互:
A: 考考你, 你知道我的名字么?我刚说过哦.
B: 我怎么会知道你的名字呢!我们才第一次见面.
可见服务端是无法区分同一个用户的连续请求,同样就更不能区分多个用户的多个请求.
由于网站或其他应用在工作中存在需要区分用户信息的业务, 所以就需要去解决HTTP无状态的问题, 但是应该用什么样的方式解决呢?
既然HTTP报文能包含数据, 那为什么不让服务器在响应中添加点东西, 比如特征, 特殊值. 那么客户端收到响应后就把这些特殊值保存下来, 在下次请求的时候带上这些值发送给服务器, 这样服务器就知道客户端是谁了.
再举个例子: 人物有前面的A和B以及嫌疑人X
第一次交互:
A: 你好, 我想办张银行卡, 我先存100万元, 我的名字是张三, 账号和密码设置为…
B: 张三女士, 这是你的银行卡(set-cookie), 存款和账号密码都设置好了, 账号和密码就印在银行卡上, 你记得好好保管哦.
第二次交互:
A: 你好, 我想取1万, 这是我的银行卡.
B: 好的, 银行卡上面的印的账号和密码是正确的, 钱都取出来了哦.插曲: A的银行卡被X偷了.
第三次交互:
X: 你好, 我要把钱取完. 我是李四.
B: 好的,银行卡上面的印的账号和密码是正确的, 钱都取出来了哦
小结:
用户的个人信息一般会放在Cookie中(这些信息可以是账号和密码, 也可以是其他东西), 用来在访问特定页面时(如访问个人中心页面)包含在请求中, 发给服务器验证.但是Cookie若被骇客盗用, 那么骇客也能去访问用户的个人中心页面, 就像上面的第三次交互.
VIII. Session
Session翻译为会话, 其含义与字面含义差不多, 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 其作用也是用来让服务器区分客户端信息.
那么问题来了, 为什么Cookie已经解决的问题, 会让Session再解决一次呢?
显然科学家或工程师们不会干这样明显且重复的事, Cookie和Session是不同的.
Session虽然作用和Cookie类似, 但是Session只是一个ID号或者说是一个标记.
通过前面的故事, 我们得知Cookie是不够安全的, 用户的信息如账户和密码是直接放在客户端(如浏览器)的, 若用户的执行了一些危险操作, 那么就会造成信息泄漏等安全问题.
Session为了解决这个问题, 服务器会将用户的信息放在服务器上, 然后生成与用户信息匹对的SessionID号, 并通过响应发送给用户, 客户端会保存该信息, 在客户端中该信息一般是一堆加密后的字符.
举个例子: E为客户端, F为服务器.
第一次交互:
E: 你好游泳馆馆长, 我叫Gollum, 这是我的衣服, 麻烦放你这里了.
F: 好的大帅哥, 你的东西都放我这了, 这是一个id卡, 你运动完了用id卡来取衣服就行了, 但是注意出游泳馆id卡会失效哦.