什么是爬虫?

爬虫概念

什么是爬虫?

网络爬虫也叫网络蜘蛛,它特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序。

爬虫有什么用?

数据采集

​ 大数据时代来临,数据就是核心,数据就是生产力,越来越多的企业开始注重收集用户数据,而爬虫技术是收集数据的一种重要手段。

搜索引擎

​ 百度,谷歌等搜索引擎都是基于爬虫技术。3. 模拟操作 爬虫也被广泛用于模拟用户操作,测试机器人,灌水机器人等。

请求与响应

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端口, 也就是服务器上的服务端程序监听的端口为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

url

发送http请求时,通过url对网络资源进行定位。URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址。也即是我们常说的网址。以下面这个URL为例,介绍下普通URL的各部分组成:

HTTP请求报文

HTTP请求客户端发送一个HTTP Request到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据。如图为访问https://www.baidu.com/和https://fanyi.baidu.com/?aldtype=16047/的请求报文大致情况.

HTTP请求方法

HTTP请求头

HTTP请求正文

请求正文通常是使用POST方法进行发送的数据,GET方法是没有请求正文的。请求正文跟上面的消息报头由一个空行隔开。

HTTP响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

HTTP响应状态码

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码。HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:

HTTP响应报头

HTTP协议的特点

HTTP三点注意事项:

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

Cookie

HTTP是无状态的,协议本身不涉及保存访问记录, 也就是请求和响应过程中不保存相关记录信息, 这样的特性会造成两个现状:

1. 基于HTTP实现的应用在数据交互时, 交互速度比较快

2. 由于不记录信息, 服务器无法区分访问自己的客户端.

EG: A是客户端, B是服务端, 进行两次交互.

第一次交互:

A: 嗨, 我叫张三, 你叫什么名字呢?

B: 你好, 我的名字是李四.

第二次交互:

A: 考考你, 你知道我的名字么?我刚说过哦.

B: 我怎么会知道你的名字呢!我们才第一次见面.


可见服务端是无法区分同一个用户的连续请求,同样就更不能区分多个用户的多个请求.

由于网站或其他应用在工作中存在需要区分用户信息的业务, 所以就需要去解决HTTP无状态的问题: 但是应该用什么样的方式解决呢?

既然HTTP报文能包含数据, 那为什么不让服务器在响应中添加点东西, 比如特征, 特殊值. 那么客户端收到响应后就把这些特殊值保存下来, 在下次请求的时候带上这些值发送给服务器, 这样服务器就知道客户端是谁了.

EG: 前面的A和B以及嫌疑人X

第一次交互:�A: 你好, 我想办张银行卡, 我先存100万元, 我的名字是张三, 账号和密码设置为…..

B: 张三女士, 这是你的银行卡(set-cookie), 存款和账号密码都设置好了, 账号和密码就印在银行卡上, 你记得好好保管哦.

第二次交互:

A: 你好, 我想取1万, 这是我的银行卡.

B: 好的, 银行卡上面的印的账号和密码是正确的, 钱都取出来了哦.

插曲: A的银行卡被X偷了.

第三次交互:

X: 你好, 我要把钱取完. 我是李四.

B: 好的,银行卡上面的印的账号和密码是正确的, 钱都取出来了哦.


总结: 用户的个人信息一般会放在Cookie中(这些信息可以是账号和密码, 也可以是其他东西), 用来在访问特定页面时(如访问个人中心页面)包含在请求中, 发给服务器验证.但是Cookie若被骇客盗用, 那么骇客也能去访问用户的个人中心页面, 就像上面的第三次交互.

Session翻译为会话, 其含义与字面含义差不多, 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 其作用也是用来让服务器区分客户端信息.

那么问题来了, 为什么Cookie已经解决的问题, 会让Session再解决一次呢?


显然科学家或工程师们不会干这样明显且重复的事, Cookie和Session是不同的.

Session虽然作用和Cookie类似, 但是Session只是一个ID号或者说是一个标记.

通过前面的故事, 我们得知Cookie是不够安全的, 用户的信息如账户和密码是直接放在客户端(如浏览器)的, 若用户的执行了一些危险操作, 那么就会造成信息泄漏等安全问题.

Session为了解决这个问题, 服务器会将用户的信息放在服务器上, 然后生成与用户信息匹对的SessionID号, 并通过响应发送给用户, 客户端会保存该信息, 在客户端中该信息一般是一堆加密后的字符.

EG: E为客户端, F为服务器.

第一次交互:

E: 你好游泳馆馆长, 我叫Gollum, 这是我的衣服, 麻烦放你这里了.

F: 好的大帅哥, 你的东西都放我这了, 这是一个id卡, 你运动完了用id卡来取衣服就行了, 但是注意出游泳馆id卡会失效哦.

Session

在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,服务器会生成一个SessionID值并和在服务器中的用户信息进行绑定, 客户端获取到SessionID后以Cookie的方式保存, 这个ID每次的访问都会带上,而服务器会识别这个SessionID由此来实现客户端的状态识别。因此session是基于cookie的

Session与Cookie相反,Session是存储在服务器上的数据,对客户端传上来的SessionID来进行判定,所以相对于Cookie,Session的安全性更高。

一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。

学习方法

作业

1.使用socket下载互联网上的一张图片。(不能使用课堂演示的图片)

关键代码截图,下载成功为前提(要能够看到下载成功后的图片)。

文章来源于互联网:(一)什么是爬虫?python+scrapy爬虫5小时入门

发表评论