互联网一般架构
- c/s: 即 client server 客户端 服务端
- b/s :即 browser server 浏览器 服务端
- m/s :即 moblie server 移动端 服务端
http协议
目前互连网上90%的网络传输都是基于http协议。
HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
报文格式
报文格式必须严格遵守
爬虫
import socket
import re
client = socket.socket() # 创建客户端
client.connect(('image.baidu.com',80)) # 链接域名
request = 'GET /search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB HTTP/1.0\r\nHost: image.baidu.com\r\n\r\n' # 构造http报文
client.send(request.encode()) # 转二进制发送报文
res = b''
data = client.recv(1024) # 一次接收1024个字节
while data: # 循环接收一直到空为止
res += data
data = client.recv(1024)
client.close()
img_urls = re.findall(b'"middleURL":"http://(.*?)"',res,re.S) # 获取页面中需要的url
s = 0 # 循环下载图片
for i in img_urls:
print(i)
a = i.decode()
b = a.split('com')
c = a.split('/')
img_request = 'GET '+b[1]+' HTTP/1.0\r\nHost: '+c[0]+'\r\nReferer: http://image.baidu.com/search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB\r\n\r\n' # 拼接页面中图片url的请求报文
img_client = socket.socket() # 创建图片url的链接
img_client.connect((c[0],80))
img_client.send(img_request.encode())
res = b''
img_data = img_client.recv(1024)
while img_data:
res += img_data
img_data = img_client.recv(1024)
img_content = re.findall(b'\r\n\r\n(.*)',res,re.S)
print(s)
with open("img/"+str(s)+'.jpg','wb') as p:
p.write(img_content[0])
s+=1
img_client.close()
一个爬取百度图片中某一页的代码,可能很繁琐,但是能运行
- 首先导入模块,
import socket
和import re
套接字和正则两个模块 - 创建客户端并链接域名
client = socket.socket()
创建一个客户端,socket.socket()固定用法
client.connect(('image.baidu.com',80))
链接需要爬取的域名content()里面必须是元组 - 构造报文并以二进制的形式发送
request = 'GET /search/index?tn=baiduimage&word=%E5%8A%A8%E6%BC%AB HTTP/1.0\r\nHost: image.baidu.com\r\n\r\n'
构造http报文,报文格式有严格要求
client.send(request.encode())
转二进制发送报文 - 接受响应
res = b''
返回的信息是以二进制的形式发送的,建一个二进制变量接受
data = client.recv(1024)
一次接收1024个字节
while data:
res += data
data = client.recv(1024)
```
一个响应肯定不止1024字节, 循环接收一直到空为止
5. `img_urls = re.findall(b'"middleURL":"http://(.*?)"',res,re.S) `用正则将需要的信息匹配出来
这样,一个爬虫的基本流程就出来了