python網(wǎng)絡編程學習筆記Web客戶端訪問_第1頁
python網(wǎng)絡編程學習筆記Web客戶端訪問_第2頁
python網(wǎng)絡編程學習筆記Web客戶端訪問_第3頁
免費預覽已結(jié)束,剩余5頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、最簡單的爬蟲網(wǎng)絡爬蟲是一個自動提取網(wǎng)頁的程序,它為搜索引擎從萬維網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成。 python的 urlliburllib2等模塊很容易實現(xiàn)這一功能,下面的例子實現(xiàn)的是對baidu首頁的下載。具體代碼如下:importurllib2page =( "" )print()提交表單數(shù)據(jù)(1) 用 GET 方法提交數(shù)據(jù)提交表單的GET 方法是把表單數(shù)據(jù)編碼至URL 。在給出請示的頁面后,加上問號,接著是表單的元素。如在百度中搜索“馬伊琍 ”得到url為&pn=100&rn=20&ie=utf-8&usm=4&rsv_pa

2、ge=1。其中?后面為表單元素。wd=%E9%A9%AC%E4%BC%8A%E7%90%8D表示搜索的詞是“馬伊琍 ”, pn 表示從第 100 條信息所在頁開始顯示(感覺是這樣,我試了幾次,當寫100時,從其所在頁顯示,但如果寫10 ,就是從第1 頁顯示), rn=20表示每頁顯示20 條, ie=utf-8表示編碼格式, usm=4沒明白是什么意思,換了 1 、2 、3 試了下,沒發(fā)現(xiàn)什么變化, rsv_page=1表示第幾頁。如果要下載以上頁面比較簡單的方法是直接用上面的網(wǎng)址進行提取。如代碼:importurllib2keyword=( ' 馬伊琍 ' )page =(

3、"" +keyword+"&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1")print()(2) 用 post 方法提交GET 方法中,數(shù)據(jù)是被加到URL 上,這種方法數(shù)據(jù)量要求不大,如果需要交換大量數(shù)據(jù)的時間, POST 方法是一個很好的方法。這里以前段時間寫的博客python 模擬 163 登陸獲取郵件列表為例,具體代碼不在列出,詳見地址:。urllib,urllib2,httplib,mechanize 的介紹模塊 ( 引自:urllib 模塊提供接口可以使我們像訪問本地文件一

4、樣來讀取www和 ftp 上的數(shù)據(jù)。模塊中最重要的兩個函數(shù)分別是:urlopen() 和 urlretrieve()。(url, data, proxies) :本函數(shù)創(chuàng)建一個表示遠程url 的類文件對象, 然后像本地文件一樣操作這個類文件對象來獲取遠程數(shù)據(jù)。 參數(shù) url表示遠程數(shù)據(jù)的路徑,一般是網(wǎng)址;參數(shù)data 表示以 post 方式提交到 url 的數(shù)據(jù);參數(shù)proxies 用于設置代理。 urlopen 返回 一個類文件對象,返回的類文件對象提供了如下方法:read(), readline(), readlines(), fileno(), close():這些方法的使用方式與文件對

5、象完全一樣 ;info() :返回一個對象,表示遠程服務器返回的頭信息;getcode() :返回 Http 狀態(tài)碼。如果是 http 請求, 200 表示請求成功完成 ;404 表示網(wǎng)址未找到;geturl():返回請求的url ;#! /usr/bin/env python#coding=utf-8importurllibcontent=( "")print"http header:",()print"http status:",()print"url:",()print"content:"

6、for linein():printline(url, filename, reporthook, data):urlretrieve方法直接將遠程數(shù)據(jù)下載到本地。參數(shù) filename指定了保存到本地的路徑(如果未指定該參數(shù),urllib會生成一個臨時文件來保存數(shù)據(jù));參數(shù)reporthook是一個回調(diào)函數(shù),當連接上服務器、以及相應的數(shù)據(jù)塊傳輸完畢的時候會觸發(fā)該回調(diào)(即每下載一塊就調(diào)用一次回調(diào)函數(shù))。我們可以利用這個回調(diào)函數(shù)來顯示當前的下載進度,也可以用于限速,下面的例子會展示。參數(shù)data指 post到服務器的數(shù)據(jù)。該方法返回一個包含兩個元素的元組 (filename, headers),

7、 filename表示保存到本地的路徑,header表示服務器的響應頭。#! /usr/bin/env python# coding: utf-8"""下載文件,并顯示下載進度"""importurllibdefDownCall(count,size,total_filesize):"""count為已下載數(shù)據(jù)塊個數(shù),size為數(shù)據(jù)塊的大小,total_filesize為文件總大小"""per=*count*size/total_filesizeifper>100:pe

8、r=100print"Already download %d KB(%.2f"%(count*size/1024,per)+"%)"url=""localfilepath=r "C:UsersAdministratorDesktop"(url,localfilepath,DownCall)urllib 中還提供了一些輔助方法,用于對 url 進行編碼、解碼。 url 中是不能出現(xiàn)一些特殊的符號的, 有些符號有特殊的用途。 我們知道以 get 方式提交數(shù)據(jù)的時候, 會在 url 中添加 key=value 這樣的字符

9、串,所以在 value 中是不允許有 '=' ,因此要對其進行編碼;與此同時服務器接收到這些參數(shù)的時候,要進行解碼, 還原成原始的數(shù)據(jù)。這個時候, 這些輔助方法會很有用:(string, safe):對字符串進行編碼。參數(shù)safe 指定了不需要編碼的字符;(string):對字符串進行解碼;(string, safe):與類似,但這個方法用'+' 來替換 ' ' ,而 quote用 '%20'來代替''(string):對字符串進行解碼;(query, doseq):將 dict或者包含兩個元素的元組列表轉(zhuǎn)換成ur

10、l參數(shù)。例如 字典'name': 'dark-bull', 'age': 200將被轉(zhuǎn)換為 "name=dark-bull&age=200"(path):將本地路徑轉(zhuǎn)換成url 路徑;(path):將 url 路徑轉(zhuǎn)換成本地路徑;urllib2模塊 ( 引自:使用 Python 訪問網(wǎng)頁主要有三種方式:urllib, urllib2, httpliburllib 比較簡單,功能相對也比較弱,httplib 簡單強大,但好像不支持session(1 )最簡單的頁面訪問res=(url)print ()( 2 )加上要 g

11、et 或 post 的數(shù)據(jù)data="name":"hank", "passwd":"hjz"(url, (data)( 3 )加上 http 頭header="User-Agent": ""(url, (data), header)使用 opener和 handleropener = (handler)(opener)( 4 )加上 sessioncj = ()cjhandler=(cj)opener = (cjhandler)(opener)( 5 )加上 Basic 認

12、證password_mgr = ()top_level_url = ""(None, top_level_url, username, password)handler = (password_mgr)opener = (handler)(opener)(6 ) 使用代理proxy_support = ("http":"")opener = (proxy_support)(opener)(7 ) 設置超時(5)httplib模塊(引自:)httplib是python中http協(xié)議的客戶端實現(xiàn),可以使用該模塊來與HTTP服務器進行交互。

13、 httplib獲取 google的內(nèi)容不是很多,也比較簡單。以下是一個非常簡單的例子,使用首頁的 html :httplib#coding=gbkimporthttplibconn=("")( 'get','/')print().read()()下面詳細介紹httplib提供的常用類型和方法。( host , port , strict , timeout )HTTPConnection類的構(gòu)造函數(shù),表示一次與服務器之間的交互,即請求/ 響應。參數(shù)host表示服務器主機, 如:;port為端口號,默認值為80;參數(shù)strict的 默認值為f

14、alse,表示在無法解析服務器返回的狀態(tài)行時( status line)OK),是否拋BadStatusLine異常;可選參數(shù)(比較典型的狀態(tài)行如:timeout表示超時時間。HTTP/ 200HTTPConnection提供的方法:( method , url , body , headers )調(diào)用 request方法會向服務器發(fā)送一次請求,method表示請求的方法,常用有方法有 get和 post; url表示請求的資源的url; body表示提交到服務器的數(shù)據(jù),必須是字符串(如果 method是 "post",則可以把body理解為 html表單中的數(shù)據(jù)) ;he

15、aders表示請求的http頭。()獲取 Http響應。返回的對象是HTTPResponse的實例,關(guān)于HTTPResponse在下面會講解。()連接到 Http服務器。()關(guān)閉與服務器的連接。( level )設置高度的級別。參數(shù)level的默認值為0 ,表示不輸出任何調(diào)試信息。HTTPResponse表示服務器對客戶端請求的響應。往往通過調(diào)用()來創(chuàng)建,它有如下方法和屬性:(amt)獲取響應的消息體。 如果請求的是一個普通的網(wǎng)頁,可選參數(shù) amt 表示從響應流中讀取指定字節(jié)的數(shù)據(jù)。那么該方法返回的是頁面的html。(name, default)獲取響應頭。 Name情況下作為默認值返回。表

16、示頭域(header field)名,可選參數(shù)default在頭域名不存在的()以列表的形式返回所有的頭信息。獲取所有的響應頭信息。獲取服務器所使用的http協(xié)議版本。 11 表示 http/; 10 表示 http/。獲取響應的狀態(tài)碼。如:200 表示請求成功。返回服務器處理請求的結(jié)果說明。一般為”O(jiān)K”下面通過一個例子來熟悉HTTPResponse中的方法:#coding=gbkimporthttplibconn= ("", 80, False)( 'get','/', headers = "Host" : "

17、;" ,"User-Agent": "Mozilla/(Windows;U; Windows NT ;zh-CN; rv: Gecko/ Firefox/","Accept" :"text/plain")res = ()print'version:',print'reason:',print'status:',print'msg:',print'headers:', ()#html#print 'n' + &#

18、39;-' * 50 + 'n'#print ()()Httplib模塊中還定義了許多常量,如:Httplib. HTTP_PORT的值為80 ,表示默認的端口號為80 ;的值為200 ,表示請求成功返回;Httplib. NOT_FOUND的值為40 表示請求的資源不存在;可以通過查詢相關(guān)變量的含義,如:Print mechanizemechanize沒有找到比較完整的介紹,自己寫了一個簡單的例子如下。# -*- coding: cp936 -*-import time,string import mechanize,urllibfrom mechanizeimpor

19、t Browserurlname=( ' 馬伊琍 ' )br =Browser()(False)#ignore theurlhttp=r''+urlname+response=(urlhttp)filename=''f =open(filename,'w')()()"&pn=10&rn=20&ie=utf-8&usm=4&rsv_page=1"1 、半開放socket利用 shutdown() 函數(shù)使 socket 單獨的參數(shù),該參數(shù)表示了如何關(guān)閉雙向數(shù)據(jù)傳輸變?yōu)閱蜗驍?shù)據(jù)

20、傳輸。shutdown()socket。具體為: 0 表示禁止將來讀;1需要一個表示禁止將來寫;2 表示禁止將來讀和寫。2 、timeouts控制超時調(diào)用 socket 的 settimeout() 函數(shù),向其傳遞參數(shù), 表明超時時間設置。 當訪問一個 socket ,如果經(jīng)過了參數(shù)設定的時間后,什么都沒有發(fā)生,則會產(chǎn)生一個異常。例如:當程序運行后,會等待數(shù)據(jù)傳入。在另一終端,利用 telnet 連接 12345 接成功后,顯示 “連接來自: * ” ,如果此時 5 秒內(nèi),終端未進行輸入,系端口。連統(tǒng)會提示連接超時退出。代碼如下:# -*- coding: cp936 -*-#tcp 響應服務

21、器importsocket,tracebackhost=''port=12345s =, , 1) (host,port) ( 1)while1 :try:clientsock,clientaddr=()exceptKeyboardInterrupt:raiseexcept:()continue(5 )try:print" 連接來自: " ,()while1 :data=(4096)ifnotlen(data):break(data)("nI get it!n")# t=raw_input('input the word:')# (t)except(KeyboardInterrupt,SystemExit):raiseexcept:print' 連接超時 'passexcept:()try:()exceptKeyboardInterrupt:r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論