Python for Infomatics 第12章 网络编程一(译)
注:文章原文为Dr. Charles Severance 的 《Python for Informatics》。文中代码用3.4版改写,并在本机测试通过。
本书中的许多例子关注的是读取文件并查找数据,但在互联网中还有许多不同信息源。
本章我们将伪装成浏览器用超文本传送协议(HTTP)从网站获取网页,通读并分析它。
12.1 超文本传送协议-HTTP
支撑网页运转的网络协议实际非常简单,在Python中内置了套接字(socket)模块,使得使用套接字创建网络连接并获取数据变得非常容易。
套接字最很像文件,可以对它进行读写,但它还提供在两个程序间进行双向连接。如果你向套接字写信息,它将把信息发送另一端程序对应的套接字上,如果你读取信息,你得到的将是对端程序发送的信息。
但是当你在对端未发送信息时去读套接字,那么你就只有坐干等了。如果两端的套接字都在接收数据而未发送数据,那么它们将等上很长一段时间。
所以程序中用于互联网通信的重要部分必须有某种协议。协议是一个定义谁先发、发的消息要干什么、怎么响应这个消息、谁接着发等的准确规则的集合。在某种意义上,两端应用程序好像在跳舞,并且确保不要踩到对方的脚趾上。
关于这些网络协议的文档有很多,超文本传送协议RFC2616链接如下:
http://www.w3.org/Protocols/rfc2616/rfc2616.txt
这个176页又长又复杂的文档有很多细节信息,如果你感兴趣你可以通读它。如果你翻看第36页,你会发现GET请求的语法。你仔细阅读,你会发现从一个网站请求获取一个文档,我们需要先和网站建立套接字连接,然后再发送GET请求。例如我们在80端口和www.py4inf.com服务器建立连接,然后发送以下格式的请求:
GET http://www.py4inf.com/code/romeo.txt HTTP/1.0
其中第二个参数是我们请求的网页,然后我们再发送一个空行。网页服务器将响应发送这个网页的头信息、文档内容和一个紧跟其后的空行。
12.2 世界上最简单的浏览器
也许显示HTTP协议如何工作的最简单方法就是写一个非常简单的Python程序,它将和网页服务器建立连接,并遵循HTTP协议规则,请求一个文档,然后在服务器送回后进行显示。代码如下:
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(b'Get http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512).decode('utf-8')
if (len(data) < 1):
break
print (data)
mysock.close()
首先这个程序和www.py4inf.com服务器在80端口建立了一个连接。因为我们的程序扮演的是网页浏览器的角色,所以HTTP协议说我们必须发送GET命令,并发送一个空行结束命令。
等我们完成发送,我们循环从socket接收512个字符块,并打印出数据,直至读不到数据为止(即:rev()方法返回一个空字符串)。
程序的输出如下:
HTTP/1.1 200 OK
Date: Fri, 22 Apr 2016 15:21:42 GMT
Server: Apache
Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT
ETag: "e103c2f4-a7-526172f5b5d89"
Accept-Ranges: bytes
Content-Length: 167
Cache-Control: max-age=604800, public
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: origin, x-requested-with, content-type
Access-Control-Allow-Methods: GET
Connection: close
Content-Type: text/plain
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fai
r sun and kill the envious moon
Who is already sick and pale with grief
输出的开头是网页服务器发送的描述这个文档的头信息。例如内容类型头表示这个文档时纯文本文件(text/plain)。
在头文件之后,服务器发送了一个空行,表示头文件结束。然后发送romeo.txt的实际数据。
这个例子展示了如何用套接字创建一个底层的网络连接。套接字可以和网页服务器、邮件服务器或其它许多类型的服务器通信。你要做就是找到描述这个协议的文档,然后依据协议编写发送和接收的代码。
因为我们用得最多的是HTTP协议,所以在Python有一个专门设计用来支持HTTP协议的特定库,用来检索网上的文档和数据。
下一节将介绍这个库。
Python for Infomatics 第12章 网络编程一(译)的更多相关文章
- Python for Infomatics 第12章 网络编程六(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.9 词汇表 Beautif ...
- Python for Infomatics 第12章 网络编程五(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.8 用urllib读取二进 ...
- Python for Infomatics 第12章 网络编程四(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulS ...
- Python for Infomatics 第12章 网络编程三(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 ...
- Python for Infomatics 第12章 网络编程二(译)
注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.3 用HTTP协议获取一张 ...
- python之路(12)网络编程
前言 基于网络通信(AF_INET)的socket(套接字)实现了TCP/UDP协议 目录 基于TCP协议的socket 基于UDP协议的socket TCP协议下粘包现象及处理 使用socketse ...
- CSAPP:第十一章 网络编程
CSAPP:第十一章 网络编程 11.1 客户端服务器模型11.2 全球IP因特网11.3 套接字接口 11.1 客户端服务器模型 每个网络应用都是基于客户端-服务器模型.采用这个模型,一个应用是 ...
- Python学习day34-面向对象和网络编程总结
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- 《深入浅出Node.js》第7章 网络编程
@by Ruth92(转载请注明出处) 第7章 网络编程 Node 只需要几行代码即可构建服务器,无需额外的容器. Node 提供了以下4个模块(适用于服务器端和客户端): net -> TCP ...
随机推荐
- Java中vector的使用详解
Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(vector)以实现类似动态数组的功能.在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大大提 ...
- Java学习笔记11
package welcome; import java.util.Scanner; /* * 代数问题:求解2x2线性方程 */ public class ComputeLinearEquation ...
- Node.js入门笔记(5):案例两则
案例分析:前端自动化 1. 实现一个自动创建前端项目文件的js 通过node.js自动创建前端项目目录,包括js目录,js目录css目录,index.html和对应的内容. 初步的代码如下: var ...
- Beanutils基本用法
Beanutils用了魔术般的反射技术,实现了很多夸张有用的功能,都是C/C++时代不敢想的.无论谁的项目,始终一天都会用得上它.我算是后知后觉了,第一回看到它的时候居然错过. 1.属性的动态gett ...
- [转]Oracle存在则更新,不存在则插入
原文:http://hi.baidu.com/mawf2008/item/eec8c7ad1c5be5ae29ce9da6 merge into a using bon (a.a=b.b)when m ...
- [Network] 计算机网络基础知识总结
计算机网络学习的核心内容就是网络协议的学习.网络协议是为计算机网络中进行数据交换而建立的规则.标准或者说是约定的集合.因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标 ...
- toolkit --------chart属性
Data Visualization类组件以直观的图表方式显示数据的分布,能够让我们更好地分析各数据的内在联系.本文主要向大家介绍该类组件的基本特性以及使用实例. 一.基本特性介绍 1.chart组件 ...
- shell--2.shell数组
shell 数组 (1)定义数组 shell中,用括号表示数组,数组元素用空格分开,定义数组的一般形式 arrt_name=(val1 val2 val3) 或者 arry_name=(val1 va ...
- BZOJ 1131: [POI2008]Sta
Description 一棵树,问以那个节点为根时根的总和最大. Sol DFS+树形DP. 第一遍统计一下 size 和 d. 第二遍转移根,统计答案就行了. Code /************* ...
- python des ecb 加密 demo
# -*- coding:utf-8 -*- from pyDes import * def hexString2bytes(src): ret =[] for i in range(len(src) ...