通过socket来下载一张图片

news/2024/7/19 9:11:38 标签: python, 网络, 爬虫
# 导入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)

运行后的结果为:

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


http://www.niftyadmin.cn/n/973450.html

相关文章

vSphere部署系列之05——虚拟机的创建和设置

vSphere部署系列之05——虚拟机的创建和设置 实验环境总体规划&#xff0c;请见前面的博文《vSphere部署系列之03——实验环境总体规划》。 这一篇中&#xff0c;以使用本地存储的esxi-mgt为例&#xff0c;讲解一下ESXi主机如何创建及设置虚拟机。 ▲总体规划网络拓扑图 一、准…

C#通讯框架改写

现有项目是利用C#的socket与PLC进行实时通讯&#xff0c;PLC有两种通讯模式——常规采集&高频采集。 其中常规采集大概在10ms左右发送一次数据&#xff0c;高频采集大概在2ms左右发送一次数据。 现有代码框架&#xff1a;在与PLC进行连接时&#xff0c;通过建立委托并创建线…

调研分享:Flipboard的使用特点和页面信息抽取机制

Flipboard是什么&#xff1f; 封面 标榜为“社会化杂志”&#xff0c;是ipad上的app应用&#xff0c;可以订阅twitter和facebook上的人、群组和话题&#xff0c;可以订阅flipboard&#xff08;后面简称flip&#xff09;指定的杂志类别&#xff0c;也可以订阅高质量的媒体站点&a…

lumen 配置数据库结果自动转数组_Thinkphp 模型和数据库:性能和安全

本章的内容主要讲解了如何给数据库的CURD查询添加回调事件&#xff0c;以及如何在最底层的SQL层面进行监听和做出性能分析及对查询性能做出优化建议&#xff0c;最后给出了一些安全方面的建议&#xff0c;学习内容主要从性能分析和优化&#xff0c;以及安全三个方面进行讲解&am…

iptables 常用命令示例

一、常用命令示例&#xff1a; 1、命令 -A, --append 范例&#xff1a;iptables -A INPUT -p tcp --dport 80 -j ACCEPT 说明 &#xff1a;新增规则到INPUT规则链中&#xff0c;规则时接到所有目的端口为80的数据包的流入连接&#xff0c;该规则将会成为规则链中的最后一条规则…

python while一定要提供循环次数吗_Python 基础 while 循环

Python 基础 while 循环 while 循环 在生活中&#xff0c;我们遇到过循环的事情吧&#xff1f;比如循环听歌。在程序中&#xff0c;也是存才的&#xff0c;这就是流程控制语句 while 基本循环 while 条件: # 循环体 # 如果条件为真&#xff0c;那么循环则执行 # 如果条件为假&a…

8.1 shell介绍8.2 命令历史8.3 命令补全和别名8.4 通配符8.5 输入输出重定向

8.1 shell介绍 1. shell是一个命令解释器&#xff0c;提供用户和机器之前的交换 2. 每个用户都可以有自己特定的shell 3. CentOS7默认shell是bash(Bourne Agin Shell); shell还有zsh、ksh等 zsh、ksh这两种shell命令没有安装, 可以用yum list搜索下这两个命令的安装包&#xff…

积分图像

参考博客&#xff1a;https://www.cnblogs.com/magic-428/p/9149868.html 1、积分图原理 积分图的每一点&#xff08;x, y&#xff09;的值是原图中对应位置的左上角区域的所有值得和&#xff1a;[6] [7] 而且&#xff0c;积分图可以只遍历一次图像即可有效的计算出来&#xff…