Python for Infomatics 第12章 网络编程二(译)

注:以下文章原文来自于Dr Charles Severance 的 《Python for Informatics》

12.3 用HTTP协议获取一张图片

  在上一节的例子中,我们获取的是一个有换行符的文本文件,并简单的把它显示在屏幕上。同样我们可以用一个小程序通过HTTP协议获取图片。下面这个程序运行时,不是直接在屏幕上显示数据,而是剔除头信息,然后将收到的数据合并保存为一个图片文件。具体代码如下:

import socket
import time

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((‘www.py4inf.com‘, 80))
mysock.send(b‘GET http://www.py4inf.com/cover.jpg HTTP/1.0\n\n‘)

count = 0
picture = b""
while True:
    data = mysock.recv(5120)
    if ( len(data) < 1 ) :
        break
    # time.sleep(0.25)
    count = count + len(data)
    print(len(data), count)
    picture = picture + data
mysock.close()

# Look for end of the header (2 CRLF)
pos = picture.find(b"\r\n\r\n")
print(‘Header length‘, pos)
print(picture[:pos].decode("utf-8"))

# Skip past the header and save the picture
picture = picture[pos+4:]
fhand = open("stuff.jpg", "wb")
fhand.write(picture)
fhand.close()

运行程序,输出如下:

5120 5120
5120 10240
5120 15360
5120 20480
5120 25600
5120 30720
960 31680
5120 36800
5120 41920
2384 44304
3752 48056
5120 53176
5120 58296
5120 63416
5120 68536
1767 70303
Header length 242
HTTP/1.1 200 OK

Date: Sat, 23 Apr 2016 06:51:38 GMT

Server: Apache

Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT

ETag: "b294001f-111a9-526172f5b7cc9"

Accept-Ranges: bytes

Content-Length: 70057

Connection: close

Content-Type: image/jpeg

  正如你看到的,它的内容类型头信息表明这个文档的主体是一张图片。一旦程序运行结束,你就可以用图片查看器打开stuff.jpg文件,你会发现这是本书的封面。

  从程序运行过程中,可以看到我们并不是每次都接收到5120个字符。在我们调用recv()方法的那个时刻,我们收到的字符数和网页服务器发给我们的一样多。在这个例子中有960,2384到最多5120个字符。因为你的网速会有所不同,所以你的输出也会不同。同时要注意的是我们收到的最后一批码流是1767个,下一次调用recv()我们将收到零长度的字符串,这告诉我们服务器已调用close()关闭了它那端的套接字,并且不会再有数据发送过来。

  我们可以取消time.sleep()的注释,减缓我们连续调用recv()的时间间隔。通过这种方式,我们在每次调用前等待1/4秒,从而让服务器赶上我们在调用recv()之前发送更多的数据。添加延时后程序的运行结果如下:

5120 5120

5120 10240
....
5120 66560
3743 70303
Header length 242
HTTP/1.1 200 OK

Date: Sat, 23 Apr 2016 07:38:55 GMT

Server: Apache

Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT

ETag: "b294001f-111a9-526172f5b7cc9"

Accept-Ranges: bytes

Content-Length: 70057

Connection: close

Content-Type: image/jpeg

  现在除了最后一次调用少于5120外,其它我们每次都接收到5120个(注:可能是网速的原因,译者的第一次接收也是5120个,而原文中第一次也小于5120)。这是服务器的发送和我们的接收共同约定的缓冲区容量。当我们采用延时接收时,在某些时刻服务器的发送可能填满这个缓冲区,从而不得不停止发送,只到我们的程序清空缓冲区。这个在发送和接收程序间的停顿被叫做流量控制。

时间: 2024-10-25 01:31:18

Python for Infomatics 第12章 网络编程二(译)的相关文章

Python for Infomatics 第12章 网络编程一(译)

注:以下文章原文来自于Dr Charles Severance 的 <Python for Informatics> 本书中的许多例子关注的是从读取文件并查找数据,但在互联网中还有许多不同信息源. 本章我们将伪装成浏览器用超文本传送协议(HTTP)从网站获取网页,通读并分析它. 12.1 超文本传送协议-HTTP 支撑网页运转的网络协议实际非常简单,在Python中内置了套接字(socket)模块,使得使用套接字创建网络连接并获取数据变得非常容易. 套接字最很像文件,可以对它进行读写,但它还提

Python for Infomatics 第12章 网络编程三(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 urllib库一项最常用的功能是抓取网页.就是我们编写一个程序,将自己伪装成网页浏览器,在获取网页之后,再以查找模式检索网页中的数据. 以搜索引擎Google为例,它将查看一个网页的源码,然后抽取其中的链接,再用这些链接获取网页.抽取链接,并一直循环.使用这个技巧,Google几乎爬遍网页上的所有页面. G

Python for Infomatics 第12章 网络编程四(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulSoup分析HTML 有很多Python库可以帮你分析HTML和抓取数据.每个库都有它们各自的强项和弱点,你可以基于你的需求选择一个. 下面的例子,我们将使用BeautifulSoup来分析一些HTML的输入,并抓取链接信息.你可以从www.crummy.com下载和安装BeautifulSoup代码.你可以在

Python for Infomatics 第13章 网页服务二(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 13.4 JavaScript Object Notation-JSON JSON的格式灵感来自JavaScript语言中的对象和数组格式.因为Python语言的发明比JavaScript要早,所以Python关于词典和列表的语法影响了JSON的语法,故而JSON和Python的词典和列表的结合体几乎完全相同. 以下是JSON的一个编码,它

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 ******************1.4 通讯协议 9 **************2.Java网络相关类 10 ******************2.1 URLDe

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条

第12章-Swing编程 --- 使用JProgressBar.ProgressMonitor和BoundedRangeModel创建进度条 (一)创建进度条 使用JProgressBar,可以很方便的创建进度条,其步骤如下: (1)创建一个JProgressBar对象,创建该对象时也可以指定3个参数,用于设置进度条的排列方向(竖直和水平).进度条的最大值和最小值.也可以在创建该对象时不传入任何参数,而是在后面程序中修改这3个属性. 下面代码创建了JProgressBar对象 //创建一条垂直进