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

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

註:文章原文為Dr. Charles Severance 的 《Python for Informatics》。文中代碼用3.4版改寫,併在本機測試通過。 12.9 辭彙表 BeautifulSoup: 一個用於分析HTML文檔,並從中抓取數據的Python庫。它彌補了大部分在瀏覽器中被忽略的HTM ...


註:文章原文為Dr. Charles Severance 的 《Python for Informatics》。文中代碼用3.4版改寫,併在本機測試通過。

12.9 辭彙表

BeautifulSoup: 一個用於分析HTML文檔,並從中抓取數據的Python庫。它彌補了大部分在瀏覽器中被忽略的HTML缺陷。你可以從www.crummy.com下載BeautifulSoup代碼。

port:埠。當你用套接字鏈接伺服器,通常表示正在聯繫的的伺服器應用程式的數字。例如,網頁服務使用80埠,電子郵件服務使用25埠。

scrape:一個程式偽裝成一個網頁瀏覽器,獲取一個頁面,然後查看網頁的內容。經常程式會跟隨一個頁面中鏈路去找到下個頁面,這樣它們可以穿越一個網頁網路或社交網路。

socket:套接字。兩個應用程式之間的網路連接。這樣程式可以雙向發送和接收數據。

spider:網路爬蟲。網頁搜索引擎通過獲取一個頁面和此頁面的所有鏈接,迴圈搜索至幾乎擁有互聯網所有頁面,並據此建立搜索索引的一種行為。

12.10 練習

 以下練習代碼均為譯者編寫,僅供參考

練習 12.1 修改socket1.py,提示用戶輸入URL,使程式可以讀取任何網頁。你可以用split('/')方法分解URL的組成部門,使你可以抽取套接字連接調用的主機名。使用try和except語句添加錯誤校驗,處理用戶輸入不正確格式的或不存在的URL。

import socket
import re

url = input('Enter an URL like this: http://www.py4inf.com/code/socket1.py\n')
if (re.search('^http://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+/',url)):
    words = url.split('/')
    hostname = words[2]
    mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        mysocket.connect((hostname, 80)) # 註意是兩個圓括弧
    except:
        print(hostname, ' is not a correct web server')
        exit
    mysocket.send(str.encode('GET ' + url + ' HTTP/1.0\n\n'))
    while True:
        data = mysocket.recv(1024).decode('utf-8')
        if (len(data) < 1): 
            break
        print (data)
    mysocket.close()
else:
    print("The URL that you input is bad format")

 

練習12.2 修改你的socket程式,使它具備對接收的字元進行計數的功能,併在顯示3000個字元後停機顯示。程式應該獲取整個文檔,對所有字元進行計數,併在文檔最後顯示字元數。

import socket
import re

url = input('Enter an URL like this: http://www.py4inf.com/code/socket1.py\n')
if (re.search('^http://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+/',url)):
    words = url.split('/')
    hostname = words[2]
    mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        mysocket.connect((hostname, 80)) # 註意是兩個圓括弧
    except:
        print(hostname, ' is not a correct server')
        exit
    mysocket.send(str.encode('GET ' + url + ' HTTP/1.0\n\n'))
    count = 0
    while True:
        data = mysocket.recv(3000).decode('utf-8')
        if (len(data) < 1): 
            break
        count = count + len(data)
        if (count <= 3000):
            print (data)
    print("The total count of this web is", count)
    mysocket.close()
    
else:
    print("The URL that you input is bad format")

 

練習12.3 使用urllib庫複製先前練習中的功能。(1)通過URL獲取文檔。(2)最多顯示3000個字元。(3)對整個文檔進行計數。不要擔心這個練習的文件頭,只需簡單顯示文檔內容的前3000個字元。

 

import urllib.request
import re

url = input('Enter an URL like this: http://www.py4inf.com/code/socket1.py\n')

if (re.search('^http://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+/',url)):
    try:
        web = urllib.request.urlopen(url)
    except:
        print(url, ' is not a valid url')
        exit

    counts = 0
    while True:
        data = web.read(3000)
        if (len(data) < 1): 
            break
        counts = counts + len(data)
        if (counts <= 3000):
            print (data.decode('utf-8'))
    print("The total counts of this web is", counts)
    
else:
    print("The URL that you input is bad format")

 

練習12.4 修改urllinks.py程式,使它抽取和統計所獲取的HTML文檔中的段標簽(p),並顯示段標簽的數量。不需顯示段的內容,只是統計即可。分別在幾個小網頁和一些長網頁上測試你的程式。

from bs4 import BeautifulSoup
import urllib.request

url = input('Enter - ')
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html,"html.parser")
tags = soup('p')
counts = 0
for tag in tags:
    counts = counts + 1
print('This web has ',counts, ' tags of p.')

練習12.5(高級)修改socket程式,使它只顯示文件頭和空行之後的數據。切記recv只接收字元(換行符及所有),而不是行。

 

import socket
import re

url = input('Enter an URL like this: http://www.py4inf.com/code/socket1.py\n')
if (re.search('^http://[a-zA-Z0-9]+\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+/',url)):
    words = url.split('/')
    hostname = words[2]

    mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        mysocket.connect((hostname, 80)) # 註意是兩個圓括弧
    except:
        print(hostname, ' is not a correct server')
        exit

    mysocket.send(str.encode('GET ' + url + ' HTTP/1.0\n\n'))
    web = b''
    while True:
        data = mysocket.recv(1024)
        if (len(data) < 1): 
            break
        web = web + data
    mysocket.close()

    pos = web.find(b'\r\n\r\n')
    print(web[pos+4:].decode('utf-8'))
else:
    print("The URL that you input is bad format")

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 第一次自己寫博客文章,大家多多指教。寫博客主要記錄一下學習的過程,給初學者提供下參考,也留給自己做備忘。 Slickflow .NET開源工作流-項目轉換 上一篇文章里說了1.2版本的下載,下載解壓後,發現使用的是VS2013創建的項目。可憐我的電腦至今最高版本是VS2010。於是就有了這篇文章。最 ...
  • 第一次自己寫博客文章,大家多多指教。寫博客主要記錄一下學習的過程,給初學者提供下參考,也留給自己做備忘。 Slickflow .NET開源工作流-介紹 這裡摘錄Slickflow官網的介紹: Slickflow工作流引擎,選取BPMN模型作為工作流模型的語義表達,BPMN模型消除技術和業務之間的隔閡 ...
  • <MySQL資料庫操作> 1.創建資料庫. 在MySQL中應用 create database 語句創建資料庫.格式如下: create database db_name; db_name 為資料庫名,必須為合法名稱.規定如下: a.不能與其他資料庫重名. b.名字可以是任意的字母,阿拉伯數字,下劃 ...
  • 變數的可見性(即作用域)和生命期既有區別,又有聯繫。 一個變數在程式的某處沒有可見性,但生命期任然可以存在,比如局部靜態變數的可見性在它所在的函數裡面,在函數外部不可訪問,但是它的生命期確是整個程式的運行期間;而一個變數生命期結束,它也就沒有了可見性,就像局部變數,隨著棧空間的釋放,它也就不存在了, ...
  • WebView提供了在Android應用中展示網頁的強大功能。也是目前Hybird app的大力發展的基礎。作為Android系統的一個非常重要的組件,它提供兩方面的強大的能力:對HTML的解析,佈局和繪製;對JavaScript的解釋和執行。Hybird App的組成是Native+H5,Nati ...
  • 在如今併發的環境下,對大數據量的查詢採用緩存是最好不過的了,本文使用redis搭建集群 (個人喜歡redis,對memcache不感冒) redis是3.0後增加的集群功能,非常強大 集群中應該至少有三個節點,每個節點有一備份節點。這樣算下來至少需要6台伺服器 考慮到有些朋友的電腦配置不是很高,跑多 ...
  • 運行結果: Hello JAVA Hello JAVA true b Hello JAVA false false false false 當創建String類型的變數並賦值時,會先到常量池中尋找是否存在這個常量的字元串,如果有則將引用(即地址)返回,如果沒有則在常量池中開闢空間並賦值沒這個給定的常 ...
  • from json_response import JsonResponse, json_response as json_resp 使用的語句如上,其實並不是沒有安裝,只是需要升級一下 pip install django-json-response --upgrade ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...