通过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+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来下载一张图片相关推荐
- 用python做一张图片_如何用python下载一张图片
如何用python下载一张图片 这里要用到的主要工具是requests这个工具,需要先安装这个库才能使用,该库衍生自urllib这个库,但是要比它更好用.多数人在做爬虫的时候选择它,是个不错的选择. ...
- 下载多张图片并压缩成压缩包
工具类 package com.manage.util;import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.St ...
- android 如何使用httpurlconnection下载一张图片demo
作为职场小白,在做android 整机app, Camera和Gallery. 但是对android 网络编程理解不是很深,所以从这篇文章开始我的网络学习之旅. 首先先通过一个例子来看如何下载一张图 ...
- js实现下载多张图片并压缩起来
1.背景 项目中需要把一些业务图片采集起来做一些分析.但是后台工作量太大,分析下前端能不能实现这个功能. 2.实现 1.jszip.js 压缩并保存图片 2.FileSaver.js 保存压缩文件 ...
- Web Services Ksoap 下载多张图片
实现Android客户端接收Web Services服务端传输的多张图片并显示的功能. Web Services 服务端: @WebService public interface ITransPic ...
- android端向后台传图片,Android前台从后台下载一张图片 以及 Android前台上传一张图片到后台...
Android 与 服务器(这里我用的是JSP)对于图片的交互(Android --> JSP && JSP --> Android) Android,在写Android项 ...
- 微信小程序--多张图片下载问题--for循环出现 漏下,乱序。最多下载5张图片的问题解决(附带个人开发小程序源码)
微信小程序多图下载,之前肯定对单张图片下载了解了.这里就不再多说. 首先,多图下载肯定是用到循环了.那么问题就出在循环这里.在循环里调用单图下载方法.这样就会出现一个问题,就是下载时先遍历完了,然后再 ...
- UE 下载多张图片批量下载
基本只适用于同一个UMG这种情况.N个独立UMG修改图片不用这么麻烦 1.Actor组件 Begin Object Class=/Script/BlueprintGraph.K2Node_Event ...
- java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端
没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客 户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送 如何从Soc ...
最新文章
- live555学习笔记2-基础类
- Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
- delphi中move函数的用法
- 活跃用户数怎么计算_留存率计算
- java 接口 print_Java-接口练习
- 用于数据分析的Python – Pandas
- 华为全面启航计算战略:“鲲鹏+昇腾”双引擎
- python爬取b站403_使用Python爬取B站全站视频信息
- tomcat启动超时(timeout)解决方法
- 微信小程序独立服务器的好处,微信小程序的优势和缺点
- iphone win7无法识别_win7系统电脑插入苹果设备提示“无法识别IOS设备”的原因和解决方法...
- 网络适配器网卡驱动错误代码56解决
- C语言【洛谷】P1007 独木桥
- openwrt固件的下载编译流程
- ArcGIS如何利用矢量shp挂接图片
- python加注释_python中加注释
- 小时候父亲是座山,我长大后山却垮了
- 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(13)——绝妙定理
- scite自动检测文件编码
- 《热尼亚·鲁勉采娃》 作者:尤里·纳吉宾 推荐者:路遥
热门文章
- 如何实现 Kubernetes 的弹性伸缩:优化核心组件
- go : 使用 grom 删除数据库数据
- html控制电脑关机,用手机控制电脑关机 方法介绍【图文】
- CSTrack: Rethinking the competition between detection and ReID in Multi-Object Tracking
- 这 10 种 MySQL 经典错误案例,99% 的程序员一定遇到过!
- 模板引擎的发展 及 thymeleaf
- Mysql 中ERROR 1406 (22001): Data too long for column 解决方法
- 十、Spring Boot 安全管理(2)
- Kotlin基础入门 - 创建、兼容一个属于自己的Kotlin项目
- Mysql按日、周、月进行分组统计