经过socket来下载一张图片

# 导入socket模块,时间模块
import socket  # socket模块是python自带的内置模块,不须要咱们去下载
import time
# url为: http://images.gaga.me/photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image/aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=/dissolve/50/gravity/Center/ws/1
# ip远程地址为:113.229.252.244
# 端口为:80
# 咱们写的请求头以下:
http_req = b'''GET /photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image\
/aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=\
/dissolve/50/gravity/Center/ws/1 HTTP/1.1\r\n\
Host: images.gaga.me\r\n\
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n\
'''
# 创建对象
client = socket.socket()
# 链接,经过(ip,端口)来进行链接
client.connect(("113.229.252.244",80))
# 根据请求头来发送请求信息
client.send(http_req)
# 创建一个二进制对象用来存储咱们获得的数据
result = b''
i = 0
# 获得响应数据
while True:
    # 每次得到的数据不超过1024字节
    http_resp = client.recv(1024)
    i = i+1
    print("这是咱们第{}次得到数据,得到的数据长度是{},得到的数据内容为{}.".format(i,len(http_resp),http_resp))
    # 将每次得到的每行数据都添加到该对象中
    result += http_resp
    # 每获取一行数据便休眠一段时间,避免出现下次得到响应数据,由于速度太快,数据还未加载出来致使的咱们获取不到数据的问题
    time.sleep(0.3)
    # 根据判断每一行获取的数据的字节长度来判断是否还存在数据,当该行数据长度等于0时,即已经获取到最后一行数据,终止循环
    if len(http_resp) <= 0:
        # 关闭浏览器对象
        client.close()
        # 终止循环
        break
# 因为咱们得到的响应文件是包括响应头和图片信息两种的,而响应头是以\r\n\r\n来进行结尾的.
# 因此咱们想得到图片信息能够以此来分割,又由于响应头是在前面的,全部咱们只须要得到第二部分的图片便可
result = result.split(b"\r\n\r\n")[1]
print("咱们得到的图片内容为{}.".format(result))
# 打开一个文件,将咱们读取到的数据存入进去,即下载到本地咱们获取到的图片
with open("可爱的小姐姐.jpg","wb") as f:
    f.write(result)

运行后的结果为:python

大概步骤为;  1. 访问一个能看到该图片的网址,我访问的是:https://v.paixin.com/photoplus/10787437浏览器

      2. 在网页中右击该图片,点击查看元素服务器

      3. 若是是使用的img标签,咱们能够直接得到它的src属性中的值,即为该图片的网络地址,访问该网络地址,咱们能够看到跳转到只有这一张图片的一个网页;若是不是使用img标签,则能够查看它的background属性,该属性中url括号中的网络地址便是图片的网络地址,访问该网络地址,咱们能够看到跳转到只有这一张图片的一个网页。网络

      4. 本文中得到到的图片的网络地址为:http://images.gaga.me/photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image/aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=/dissolve/50/gravity/Center/ws/1socket

      5. 此时右键图片打开查看元素,点击出现界面的最上面一行中的网络(或者说network),而后刷新该网页,你会发现网络的下面加载出来一堆的东西,通常来讲你点击最上面的第一个文件就是你想要的文件。函数

    6. 而后咱们就能够得到域名,IP,请求方式,和http版本号,这样咱们就能够写出咱们的请求头了。学习

    7. 而后创建client对象,经过IP和端口,以及咱们写好的请求头,来经过send函数对服务器发送请求url

    8. 而后经过recv函数来得到服务器响应给咱们的数据,须要注意的是,该函数每次只能获取一行数据,若是咱们想要获取须要得到的所有数据,就须要使用循环了。spa

    9. client.recv(1024)是指,咱们每次得到到的数据不得超过1024字节,即若是该行数据小于1024则直接获取,若是多于1024则分多行进行获取,若是该行没有数据了,那么它的字节长度将会是0,咱们也能够依据此来进行结束循环的标志。3d

    10. 须要注意的是,咱们得到的数据,包括两部分: 响应头和图片数据,咱们只须要图片数据,那么咱们能够根据\r\n\r\n来使用split函数来进行分割,来仅仅获取图片部分的内容,由于响应头都是以\r\n\r\n来进行结尾的。

    11. 而后将咱们得到的图片数据以二进制的形式(wb)来写入文件,这样该图片就下载到本地了。

    12.  socket 套接字: 几乎全部的网络通讯的底层都是由套接字实现.
      socket 可以为咱们建立TCP链接,能够把本身编写好的请求报文发送给服务器了.
      socket 对咱们爬虫来讲默认只能针对HTTP, 而相对于HTTPS的资源, 该模块不行.

--------------------------------------------------------------------------------------------------------------------------------------------

本文仅为我的学习笔记,若是侵权或python问题讨论或指正,欢迎发送邮件到1730797947@qq.com,我会及时删除或修改文章或回复的。

相关文章
相关标签/搜索