socket爬取图片

  在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

  小编初学者,只能写一些例子。

  先写一个 服务端的例子:

  作为本地服务器,端口为8080,监听到请求后 发送hello world。

import socket


def fun1():
    # 创建服务端
    server = socket.socket()
    # 绑定IP 端口  启动本地的服务器
    server.bind(('0.0.0.0', 8080))
    # 监听 有没有人访问
    server.listen(5)  # 连接数量
    # 接受
    conn, addr = server.accept()
    print(addr)
    # 接收数据
    conn.send(b'hello world')
    # data = conn.recv(1024)

  下面创建一个客户端,用来发送请求。

def fun():
    # 客户端
    client = socket.socket()
    # 连接百度服务器
    client.connect(('0.0.0.0', 8080))
    # 构造报文
    data = b'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n'
    # 发送报文
    client.send(data)
    # 接受数据
    res = client.recv(1024)
    # print(res)
    temp = b''
    while res:
        temp += res
        res = client.recv(4096)
    # 提取正文
    # print(re.findall(b'\r\n\r\n(.*)', temp, re.S)[0])
    print(temp.decode())

fun()

客户端发送请求之后会,服务器会发送 ‘hello world’。

下面 写一个客户端访问 2717.com 获取图片数据。

import socket
import ssl
import re
# 1 找到图片的来源 从某个服务器下载的
# 2network 中的image项
# 3 https://t1.hddhhn.com/uploads/tu/201905/30/56dg.jpg


client1 = socket.socket()         # HTTP
client = ssl.wrap_socket(socket.socket())   # HTTPS 协议客户端
# 访问image url
# 构造报文
data = b'GET /uploads/tu/201905/30/56dg.jpg HTTP/1.1\r\nHost: t1.hddhhn.com\r\n\r\n'
# 请求服务器
client.connect(('t1.hddhhn.com', 443))
client.send(data)
# 接受图片的数据
# res = client.recv(1024)
# print(res)
# 拿到二进制的数据
img_first_data = client.recv(1024)
length = int(re.findall(b'Content-Length: (.*?)\r\n', img_first_data, re.S)[0])
print(length)
img_data = b''
img_data += re.findall(b'\r\n\r\n(.*)', img_first_data, re.S)[0]
while True:
    temp = client.recv(1024)
    if temp:
        img_data += temp
    else:
        break

    if len(img_data) >= length:   # 数据是否接受完成
        break
print(len(img_data), length)

with open('test.jpg', 'wb') as f:
    f.write(img_data)

猜你喜欢

转载自www.cnblogs.com/a-runner/p/12273127.html