01 认识爬虫
一、HTTP与HTTPS
1、应用框架
互联网的飞速发展是商业经济推动的。目前几乎所有的商业应用都是基于互联网的,它们一般采用c/s架构,b/s架构或者m/s架构。
c/s 即 client server 客户端 服务端
b/s 即 browser server 浏览器 服务端
m/s 即 moblie server 移动端 服务端
2、http协议
目前互连网上90%的网络传输都是基于http协议。
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
3、http请求流程
一次http请求的基本流程是,有客户端向服务端发起一次请求(request), 而服务器在接收到以后返回给客户端一个响应(response)。所以一次完整的http请求包含请求和响应两部分。
默认的http协议端口为80端口。
4、url
发送http请求时,通过url对网络资源进行定位。
URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址。也即是我们常说的网址。以下面这个URL为例,介绍下普通URL的各部分组成:
4、HTTP请求格式
http请求
客户端发送一个HTTP请求到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据。
下图给出请求报文的一般格式。
5、HTTP请求方法
根据http标准,http请求可以使用多种请求方法。
1.0定义了三种请求方法:GET,POST和HEAD方法
1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
常用方法 是 get和post。
-
GET
其实简单来说,
GET
方法一般用来负责获取数据,或者将一些简短的数据放到URL参数中传递到服务器。比POST
更加高效和方便。 -
POST
由于
GET
方法最多在url中携带1024字节数据,且将数据放到URL中传递太不安全,数据量大时URL也会变得冗长。所以传递数据量大或者安全性要求高的数据的时候,最好使用POST
方法来传递数据。
5、HTTP请求头
6、HTTP请求正文
请求正文通常是使用POST方法进行发送的数据,GET方法是没有请求正文的。
请求正文跟上面的消息报头由一个空行隔开。
7、HTTP响应
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
8、HTTP响应状态码
当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码。
HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:
9、HTTP响应报头
10、HTTP协议的特点
HTTP三点注意事项:
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
11、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
二、爬虫概念
1、爬虫的概念和应用
网络爬虫也叫网络蜘蛛,它特指一类自动批量下载网络资源的程序,这是一个比较口语化的定义。
更加专业和全面对的定义是:网络爬虫是伪装成客户端与服务端进行数据交互的程序。
- 数据采集
大数据时代来临,数据就是核心,数据就是生产力,越来越多的企业开始注重收集用户数据,而爬虫技术是收集数据的一种重要手段。 - 搜索引擎
百度,谷歌等搜索引擎都是基于爬虫技术。 - 模拟操作
爬虫也被广泛用于模拟用户操作,测试机器人,灌水机器人等。
2、爬虫开发的重难点
- 数据的获取
网络公共资源都是为用户准备的,为了避免被爬虫采集,服务端会设置非常多的图灵测试,阻止爬虫的恶意爬取,也即是反爬措施。爬虫开发工程师在开发爬虫时,需要解决这些反爬措施。我们在开发爬虫的过程中,有很大一部分的工作就是处理这些反爬措施。 - 采集的速度
大数据时代,需要巨大的数据量,动辄千万条的级别,甚至上亿条。如果采集速度跟不上,耗时过长,那么就达不到商业要求。一般我们会采取并发以及分布式来解决速度上的问题。这也是爬虫开发过程中的另外一个重心。
3、爬虫基础socket模块
1)创建服务端
# 导入socket模块
import socket
#创建服务端
server = socket.socket()
#绑定ip地址及端口号
server.bind(("127.0.0.1",8080))
#开始监听
server.listen(5) #设置为最多同时接收5个请求
print('等待客户端的连接...')
tcpCliSock, addr = server.accept() #接收客户端连接请求
print('取得连接:', addr)
data = tcpCliSock.recv(1024)
print(data)
tcpCliSock.close() #关闭与客户端的连接
server.close() #关闭服务器socket
# 等待客户端的连接...
# 取得连接: ('127.0.0.1', 2074)
# b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n'
2)创建客户端
# 导入socket模块
import socket
# 创建客户端
client = socket.socket()
# 连接百度服务器
client.connect(("www.baidu.com",80))
# 构建HTTP报文
request = b"GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n"
# 发送请求
client.send(request)
# 接收响应数据
res =b""
data = client.recv(4096)
while data:
res += data
data = client.recv(4096)
# print(res)
print(res.decode())
3)使用socket下载图片
# 导入socket模块
import socket,re
# 创建客户端
client = socket.socket()
# 图片地址
img_url = "http://i0.hdslb.com/bfs/archive/c6dad696f6c0aebff97f30a5f8c63f9ed09bcac8.jpg"
# 连接服务器
client.connect(("i0.hdslb.com",80))
# 构建HTTP报文
request = b"GET /bfs/archive/c6dad696f6c0aebff97f30a5f8c63f9ed09bcac8.jpg HTTP/1.0\r\nHost: i0.hdslb.com\r\n\r\n"
# 发送请求
client.send(request)
# 接收响应数据
res =b""
data = client.recv(4096)
while data:
res += data
data = client.recv(4096)
client.close()
print(res)
img_data = re.findall(b"\r\n\r\n(.*)",res,re.S)[0]
img_data = img_data.strip()
print(img_data)
with open("ez.jpg","wb") as f:
f.write(img_data)
三、会话技术
1、Cookie
http是无状态的,那服务端怎么区分同一个用户的连续请求呢,这就用到了会话技术:cookie和session。
Cookie有时也用其复数形式 Cookies,英文是饼干的意思。指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。最新的规范是 RFC6265 。
Cookie其实就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。 服务器在接收到Cookie以后,会验证Cookie的信息,以此来辨别用户的身份。
Cookie可以理解为一个凭证。
2、Session
Session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。这个词在各个领域都有在使用。
而我们web领域,一般使用的是其本义,一个浏览器窗口从打开到关闭这个期间。
Session的目的则是,在一个客户从打开浏览器到关闭浏览器这个期间内,发起的所有请求都可以被识别为同一个用户。而实现的方式则是,在一个客户打开浏览器开始访问网站的时候,会生成一个cookie,SessionID,这个ID每次的访问都会带上,而服务器会识别这个SessionID并且将与这个SessionID有关的数据保存在服务器上。由此来实现客户端的状态识别。因此session是基于cookie的
Session与Cookie相反,Session是存储在服务器上的数据,只由客户端传上来的SessionId来进行判定,所以相对于Cookie,Session的安全性更高。
一般SessionID会在浏览器被关闭时丢弃,或者服务器会验证Session的活跃程度,例如30分钟某一个SessionID都没有活跃,那么也会被识别为失效。