• 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
    
    ')
    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协议的特定库,用来检索网上的文档和数据。
      下一节将介绍这个库。

  • 相关阅读:
    view加阴影和边框
    监视scrollview是否滚动到底
    (疯狂java)第二课
    (疯狂java)第一课
    iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon
    UIPanGestureRecognizer中translationInView的理解
    Btn要记得对状态进行设置
    添加navbar以及上面的左右按钮代码
    uimodalpresentationformsheet resize ios7
    Java Socket
  • 原文地址:https://www.cnblogs.com/zhengsh/p/5392744.html
Copyright © 2020-2023  润新知