Python for Infomatics 第12章 網路編程二(譯)

来源:http://www.cnblogs.com/zhengsh/archive/2016/04/23/5424261.html
-Advertisement-
Play Games

註:以下文章原文來自於Dr Charles Severance 的 《Python for Informatics》 12.3 用HTTP協議獲取一張圖片 在上一節的例子中,我們獲取的是一個有換行符的文本文件,並簡單的把它顯示在屏幕上。同樣我們可以用一個小程式通過HTTP協議獲取圖片。下麵這個程式運 ...


註:以下文章原文來自於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)。這是伺服器的發送和我們的接收共同約定的緩衝區容量。當我們採用延時接收時,在某些時刻伺服器的發送可能填滿這個緩衝區,從而不得不停止發送,只到我們的程式清空緩衝區。這個在發送和接收程式間的停頓被叫做流量控制。

12.4 用urllib獲取網頁

  雖然我們可以用socket庫在HTTP協議上人工發送和接收數據,但是在Python中用urllib庫來完成這項常見任務來得更加簡單。

  用urllib,你可以把網頁看作是一個文件,你只要簡單地指出你要哪個網頁,剩下的就由urllib來處理了。

  與用socket讀取romeo.txt具備相同功能的urllib代碼如下:

import urllib.request
fhand = urllib.request.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in fhand:
    print(line.strip().decode('utf-8'))

  一旦這個網頁被urllib.request.urlopen打開,我們就可以把它看作一個文件,並且迴圈讀取。

  當運行這個程式時,我們只能看到文件的內容。雖然文件頭仍然被髮送,但是urllib代碼消除了文件頭,只返回以下內容:  

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

  下個例子中,我們在獲取romeo.txt之後,計算文件中每個詞出現的頻率:

import urllib.request
counts = dict()
fhand = urllib.request.urlopen('http://www.py4inf.com/code/romeo.txt')
for line in fhand:
    words = line.decode('utf-8').split()
    for word in words:
        counts[word] = counts.get(word,0) + 1
print (counts)

  代碼的輸出結果如下:

{'is': 3, 'kill': 1, 'light': 1, 'sun': 2, 'Arise': 1, 'moon': 1, 'It': 1, 'yonder': 1, 'the': 3, 'But': 1, 'fair': 1, 'and': 3, 'east': 1, 'soft': 1, 'Juliet': 1, 'grief': 1, 'already': 1, 'breaks': 1, 'envious': 1, 'sick': 1, 'pale': 1, 'what': 1, 'through': 1, 'Who': 1, 'with': 1, 'window': 1}

  再次說明,一旦我們打開了這個網頁,我們就可以像本地文檔一下讀取它。  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 【身份證最後一位神秘X的由來】身份證中的“冷知識”1999年的今天,《國務院關於實行公民身份號碼制度的決定》被髮布,當年10月1日實施。為什麼有的有X?這位數是根據前17位計算出的校驗碼。如某人尾號是0-9,不會有X,如是10,則用X代替。Ⅹ是羅馬數字的10,這能保證身份證號不多位。 ...
  • using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Reflection; using System.Collections; using System. ...
  • 1、匹配a標簽及其url: 說明:在上面的正則表達式中, 用來匹配href屬性前面和後面的各種屬性: 用來匹配href屬性引號中間的url: 用來匹配a標簽之間的內容: 2、匹配img標簽及其url: 3、匹配標簽及標簽中間的內容: 說明:當html字元串如下時,可以匹配到兩處, 如果正則表達式這樣 ...
  • 異常背景: 第一次開發 WPF 時,所有資源都定義在 App.xaml 文件中。隨著項目資源的增多,查看與修改資源時很麻煩,就在 App.xaml 以集成資源字典的方式。 異常原因: 在 App.xaml 中定義資源時,我把項目中需要使用的 Class 都寫在最上面 <Application.Res ...
  • html dom,文件夾名稱,文件名稱·······,都儘量不用ad,adv···,advertisement 這些關鍵詞! 為嘛呢? 因為會被瀏覽器的廣告插件自動給屏蔽掉。 我的網站中有一個廣告管理頁面: /advertisement/AdvertisingSpaces.aspx 用於管理網站的廣 ...
  • MailMessage mailMessage = new MailMessage();ArrayList attachsendObject = new ArrayList();string mailServer = "internalmail.morningstar.com"; mailMessa ...
  • 在開發一個串口通信程式時,用到需要將10進位轉換為16進位的情況,參照瞭如下類容: From:http://www.cnblogs.com/xdotnet/archive/2009/01/17/tostring_format.html 在很多對象顯示為字元串的時候都會使用到ToString中的格式化 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...