利用socket爬取简单图片

(socket比较底层,在以后实际爬虫中不会太大使用,因此利用它爬取简单图片了解一下他的功能)

1.打开网页获取目标url
简单爬虫
2.查看Headers 构造报文
简单爬虫
我们需要(请求方式、host、User-Agent)来构造报文:

http_req = b'GET /wp-content/uploads/2017/09/13.jpg HTTP/1.1\r\nHost: wmtp.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n\r\n'

3.构造好报文发送请求为使数据接收完整则要使用方法(recv)循环接收

while True:
    data = client.recv(1024)
    http_b += data
    if len(data) < 1024:
        client.close()
        print(http_b)
        break

4.对接受的数据进行筛选(图片是二进制数据所以只需要\r\n\r\n后的数据)
简单爬虫
5.保存图片

with open('luhan.jpg', 'wb')as f:
    f.write(b_data)

6.最后附上源码

import socket
# 图片地址
url = '/wp-content/uploads/2017/09/13.jpg'
# 实例化socket对象
client = socket.socket()
# 链接地址
client.connect(('115.231.220.147', 80))
# 构造报文
http_req = b'GET /wp-content/uploads/2017/09/13.jpg HTTP/1.1\r\nHost: wmtp.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n\r\n'
# 发送报文请求
client.send(http_req)
# 创建空的字节对象用于储存字节
http_b = b''
# 循环接受
while True:
    data = client.recv(1024)
    http_b += data
    if len(data) < 10:
        client.close()
        print(http_b)
        break
# 对返回的数据进行筛选
b_data = http_b.split(b'\r\n\r\n')[1]
# 写入文件
with open('luhan.jpg', 'wb')as f:
    f.write(b_data)

总结:
分析网页
构造请求
发送请求
接受数据
保存需要的数据

相关文章: