# 导入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+1print("这是我们第{}次获得数据,获得的数据长度是{},获得的数据内容为{}.".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)

运行后的结果为:

大概步骤为;  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/1

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

    6. 然后我们就可以获得域名,IP,请求方式,和http版本号,这样我们就可以写出我们的请求头了。

    7. 然后建立client对象,通过IP和端口,以及我们写好的请求头,来通过send函数对服务器发送请求

    8. 然后通过recv函数来获得服务器响应给我们的数据,需要注意的是,该函数每次只能获取一行数据,如果我们想要获取需要获得的全部数据,就需要使用循环了。

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

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

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

    12.  socket 套接字: 几乎所有的网络通信的底层都是由套接字实现.
      socket 能够为我们创建TCP连接,可以把自己编写好的请求报文发送给服务器了.
      socket 对我们爬虫来说默认只能针对HTTP, 而相对于HTTPS的资源, 该模块不行.

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

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

      

转载于:https://www.cnblogs.com/wangyusu/p/10905679.html

通过socket来下载一张图片相关推荐

  1. 用python做一张图片_如何用python下载一张图片

    如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...

  2. 下载多张图片并压缩成压缩包

    工具类 package com.manage.util;import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.St ...

  3. android 如何使用httpurlconnection下载一张图片demo

    作为职场小白,在做android 整机app, Camera和Gallery.  但是对android 网络编程理解不是很深,所以从这篇文章开始我的网络学习之旅. 首先先通过一个例子来看如何下载一张图 ...

  4. js实现下载多张图片并压缩起来

    1.背景 项目中需要把一些业务图片采集起来做一些分析.但是后台工作量太大,分析下前端能不能实现这个功能. 2.实现 1.jszip.js 压缩并保存图片 2.FileSaver.js  保存压缩文件 ...

  5. Web Services Ksoap 下载多张图片

    实现Android客户端接收Web Services服务端传输的多张图片并显示的功能. Web Services 服务端: @WebService public interface ITransPic ...

  6. android端向后台传图片,Android前台从后台下载一张图片 以及 Android前台上传一张图片到后台...

    Android 与 服务器(这里我用的是JSP)对于图片的交互(Android --> JSP && JSP --> Android) Android,在写Android项 ...

  7. 微信小程序--多张图片下载问题--for循环出现 漏下,乱序。最多下载5张图片的问题解决(附带个人开发小程序源码)

    微信小程序多图下载,之前肯定对单张图片下载了解了.这里就不再多说. 首先,多图下载肯定是用到循环了.那么问题就出在循环这里.在循环里调用单图下载方法.这样就会出现一个问题,就是下载时先遍历完了,然后再 ...

  8. UE 下载多张图片批量下载

    基本只适用于同一个UMG这种情况.N个独立UMG修改图片不用这么麻烦 1.Actor组件 Begin Object Class=/Script/BlueprintGraph.K2Node_Event ...

  9. java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

    没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Soc ...

最新文章

  1. live555学习笔记2-基础类
  2. Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
  3. delphi中move函数的用法
  4. 活跃用户数怎么计算_留存率计算
  5. java 接口 print_Java-接口练习
  6. 用于数据分析的Python – Pandas
  7. 华为全面启航计算战略:“鲲鹏+昇腾”双引擎
  8. python爬取b站403_使用Python爬取B站全站视频信息
  9. tomcat启动超时(timeout)解决方法
  10. 微信小程序独立服务器的好处,微信小程序的优势和缺点
  11. iphone win7无法识别_win7系统电脑插入苹果设备提示“无法识别IOS设备”的原因和解决方法...
  12. 网络适配器网卡驱动错误代码56解决
  13. C语言【洛谷】P1007 独木桥
  14. openwrt固件的下载编译流程
  15. ArcGIS如何利用矢量shp挂接图片
  16. python加注释_python中加注释
  17. 小时候父亲是座山,我长大后山却垮了
  18. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(13)——绝妙定理
  19. scite自动检测文件编码
  20. 《热尼亚·鲁勉采娃》 作者:尤里·纳吉宾 推荐者:路遥

热门文章

  1. 如何实现 Kubernetes 的弹性伸缩:优化核心组件
  2. go : 使用 grom 删除数据库数据
  3. html控制电脑关机,用手机控制电脑关机 方法介绍【图文】
  4. CSTrack: Rethinking the competition between detection and ReID in Multi-Object Tracking
  5. 这 10 种 MySQL 经典错误案例,99% 的程序员一定遇到过!
  6. 模板引擎的发展 及 thymeleaf
  7. Mysql 中ERROR 1406 (22001): Data too long for column 解决方法
  8. 十、Spring Boot 安全管理(2)
  9. Kotlin基础入门 - 创建、兼容一个属于自己的Kotlin项目
  10. Mysql按日、周、月进行分组统计