python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(六):Web客戶(hù)端訪問(wèn)
6.1 最簡(jiǎn)單的爬蟲(chóng)
網(wǎng)絡(luò)爬蟲(chóng)是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序,它為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè),是搜索引擎的重要組成。python的urllib\urllib2等模塊很容易實(shí)現(xiàn)這一功能,下面的例子實(shí)現(xiàn)的是對(duì)baidu首頁(yè)的下載。具體代碼如下:
import urllib2
page=urllib2.urlopen("http://www.baidu.com")
print page.read()
6.2 提交表單數(shù)據(jù)
(1)用GET方法提交數(shù)據(jù)
提交表單的GET方法是把表單數(shù)據(jù)編碼至URL。在給出請(qǐng)示的頁(yè)面后,加上問(wèn)號(hào),接著是表單的元素。如在百度中搜索“馬伊琍”得到url為http://www.baidu.com/s?wd=%E9%A9%AC%E4%BC%8A%E7%90%8D&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1。其中?后面為表單元素。wd=%E9%A9%AC%E4%BC%8A%E7%90%8D表示搜索的詞是“馬伊琍”,pn表示從第100條信息所在頁(yè)開(kāi)始顯示(感覺(jué)是這樣,我試了幾次,當(dāng)寫(xiě)100時(shí),從其所在頁(yè)顯示,但如果寫(xiě)10,就是從第1頁(yè)顯示),rn=20表示每頁(yè)顯示20條,ie=utf-8表示編碼格式,usm=4沒(méi)明白是什么意思,換了1、2、3試了下,沒(méi)發(fā)現(xiàn)什么變化,rsv_page=1表示第幾頁(yè)。如果要下載以上頁(yè)面比較簡(jiǎn)單的方法是直接用上面的網(wǎng)址進(jìn)行提取。如代碼:
import urllib2
keyword=urllib.quote('馬伊琍')
page=urllib2.urlopen("http://www.baidu.com/s?wd="+keyword+"&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1")
print page.read()
(2)用post方法提交
GET方法中,數(shù)據(jù)是被加到URL上,這種方法數(shù)據(jù)量要求不大,如果需要交換大量數(shù)據(jù)的時(shí)間,POST方法是一個(gè)很好的方法。這里以前段時(shí)間寫(xiě)的博客《python模擬163登陸獲取郵件列表》為例,具體代碼不在列出,詳見(jiàn)地址:http://www.cnblogs.com/xiaowuyi/archive/2012/05/21/2511428.html。
6.3 urllib,urllib2,httplib,mechanize的介紹
6.3.1urllib模塊(引自:http://my.oschina.net/duhaizhang/blog/68893)
urllib模塊提供接口可以使我們像訪問(wèn)本地文件一樣來(lái)讀取www和ftp上的數(shù)據(jù)。模塊中最重要的兩個(gè)函數(shù)分別是:urlopen()和urlretrieve()。
urllib.urlopen(url[, data[, proxies]]) :
本函數(shù)創(chuàng)建一個(gè)表示遠(yuǎn)程url的類(lèi)文件對(duì)象,然后像本地文件一樣操作這個(gè)類(lèi)文件對(duì)象來(lái)獲取遠(yuǎn)程數(shù)據(jù)。參數(shù)url表示遠(yuǎn)程數(shù)據(jù)的路徑,一般是網(wǎng)址;參數(shù)data表示以post方式提交到url的數(shù)據(jù);參數(shù)proxies用于設(shè)置代理。urlopen返回 一個(gè)類(lèi)文件對(duì)象,返回的類(lèi)文件對(duì)象提供了如下方法:
read(), readline(), readlines(), fileno(), close():這些方法的使用方式與文件對(duì)象完全一樣;
info():返回一個(gè)httplib.HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息;
getcode():返回Http狀態(tài)碼。如果是http請(qǐng)求,200表示請(qǐng)求成功完成;404表示網(wǎng)址未找到;
geturl():返回請(qǐng)求的url;
#! /usr/bin/env python
#coding=utf-8
import urllib
content=urllib.urlopen("http://www.baidu.com")
print "http header:",content.info()
print "http status:",content.getcode()
print "url:",content.geturl()
print "content:"
for line in content.readlines():
print line
urllib.urlretrieve(url[, filename[, reporthook[, data]]]):
urlretrieve方法直接將遠(yuǎn)程數(shù)據(jù)下載到本地。參數(shù)filename指定了保存到本地的路徑(如果未指定該參數(shù),urllib會(huì)生成一個(gè)臨時(shí)文件來(lái)保存數(shù)據(jù));參數(shù)reporthook是一個(gè) 回調(diào)函數(shù),當(dāng)連接上服務(wù)器、以及相應(yīng)的數(shù)據(jù) 塊傳輸完畢的時(shí)候會(huì)觸發(fā)該回調(diào)(即每下載一塊就調(diào)用一次回調(diào)函數(shù))。我們可以利用這個(gè)回調(diào)函 數(shù)來(lái)顯示當(dāng)前的下載進(jìn)度,也可以用于限速,下面的例子會(huì)展示。參數(shù)data指post到服務(wù)器的數(shù)據(jù)。該方法返回一個(gè)包含兩個(gè)元素的元組(filename, headers),filename表示保存到本地的路徑, header表示服務(wù)器的響應(yīng)頭。
#! /usr/bin/env python
# coding: utf-8
"""下載文件,并顯示下載進(jìn)度"""
import urllib
def DownCall(count,size,total_filesize):
"""count為已下載數(shù)據(jù)塊個(gè)數(shù),size為數(shù)據(jù)塊的大小,total_filesize為文件總大小"""
per=100.0*count*size/total_filesize
if per>100:
per=100
print "Already download %d KB(%.2f" %(count*size/1024,per)+"%)"
url="http://www.research.rutgers.edu/~rohanf/LP.pdf"
localfilepath=r"C:\Users\Administrator\Desktop\download.pdf"
urllib.urlretrieve(url,localfilepath,DownCall)
urllib中還提供了一些輔助方法,用于對(duì)url進(jìn)行編碼、解碼。url中是不能出現(xiàn)一些特殊的符號(hào)的,有些符號(hào)有特殊的用途。我們知道以get方式提交數(shù)據(jù)的時(shí)候,會(huì)在url中添加key=value這樣的字符串,所以在value中是不允許有'=',因此要對(duì)其進(jìn)行編碼;與此同時(shí)服務(wù)器接收到這些參數(shù)的時(shí)候,要進(jìn)行解碼,還原成原始的數(shù)據(jù)。這個(gè)時(shí)候,這些輔助方法會(huì)很有用:
urllib.quote(string[, safe]):對(duì)字符串進(jìn)行編碼。參數(shù)safe指定了不需要編碼的字符;
urllib.unquote(string) :對(duì)字符串進(jìn)行解碼;
urllib.quote_plus(string[, safe]) :與urllib.quote類(lèi)似,但這個(gè)方法用'+'來(lái)替換' ',而quote用'%20'來(lái)代替' '
urllib.unquote_plus(string) :對(duì)字符串進(jìn)行解碼;
urllib.urlencode(query[, doseq]):將dict或者包含兩個(gè)元素的元組列表轉(zhuǎn)換成url參數(shù)。例如 字典{'name': 'dark-bull', 'age': 200}將被轉(zhuǎn)換為"name=dark-bull&age=200"
urllib.pathname2url(path):將本地路徑轉(zhuǎn)換成url路徑;
urllib.url2pathname(path):將url路徑轉(zhuǎn)換成本地路徑;
6.3.2 urllib2模塊(引自:http://hankjin.blog.163.com/blog/static/3373193720105140583594/)
使用Python訪問(wèn)網(wǎng)頁(yè)主要有三種方式: urllib, urllib2, httplib
urllib比較簡(jiǎn)單,功能相對(duì)也比較弱,httplib簡(jiǎn)單強(qiáng)大,但好像不支持session
(1)最簡(jiǎn)單的頁(yè)面訪問(wèn)
res=urllib2.urlopen(url)
print res.read()
(2)加上要get或post的數(shù)據(jù)
data={"name":"hank", "passwd":"hjz"}
urllib2.urlopen(url, urllib.urlencode(data))
(3)加上http頭
header={"User-Agent": "Mozilla-Firefox5.0"}
urllib2.urlopen(url, urllib.urlencode(data), header)
使用opener和handler
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
(4)加上session
cj = cookielib.CookieJar()
cjhandler=urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cjhandler)
urllib2.install_opener(opener)
(5)加上Basic認(rèn)證
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = "http://www.163.com/"
password_mgr.add_password(None, top_level_url, username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
(6) 使用代理
proxy_support = urllib2.ProxyHandler({"http":"http://1.2.3.4:3128/"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
(7) 設(shè)置超時(shí)
socket.setdefaulttimeout(5)
6.3.3 httplib模塊(引自:http://hi.baidu.com/avengert/item/be5daec8517b12ddee183b81)
httplib 是 python中http 協(xié)議的客戶(hù)端實(shí)現(xiàn),可以使用該模塊來(lái)與 HTTP 服務(wù)器進(jìn)行交互。httplib的內(nèi)容不是很多,也比較簡(jiǎn)單。以下是一個(gè)非常簡(jiǎn)單的例子,使用httplib獲取google首頁(yè)的html:
#coding=gbk
import httplib
conn = httplib.HTTPConnection("www.google.cn")
conn.request('get', '/')
print conn.getresponse().read()
conn.close()
下面詳細(xì)介紹httplib提供的常用類(lèi)型和方法。
httplib.HTTPConnection ( host [ , port [ , strict [ , timeout ]]] )
HTTPConnection類(lèi)的構(gòu)造函數(shù),表示一次與服務(wù)器之間的交互,即請(qǐng)求/響應(yīng)。參數(shù)host表示服務(wù)器主機(jī),如:www.csdn.net;port為端口號(hào),默認(rèn)值為80; 參數(shù)strict的 默認(rèn)值為false, 表示在無(wú)法解析服務(wù)器返回的狀態(tài)行時(shí)( status line) (比較典型的狀態(tài)行如: HTTP/1.0 200 OK ),是否拋BadStatusLine 異常;可選參數(shù)timeout 表示超時(shí)時(shí)間。
HTTPConnection提供的方法:
HTTPConnection.request ( method , url [ , body [ , headers ]] )
調(diào)用request 方法會(huì)向服務(wù)器發(fā)送一次請(qǐng)求,method 表示請(qǐng)求的方法,常用有方法有g(shù)et 和post ;url 表示請(qǐng)求的資源的url ;body 表示提交到服務(wù)器的數(shù)據(jù),必須是字符串(如果method 是"post" ,則可以把body 理解為html 表單中的數(shù)據(jù));headers 表示請(qǐng)求的http 頭。
HTTPConnection.getresponse ()
獲取Http 響應(yīng)。返回的對(duì)象是HTTPResponse 的實(shí)例,關(guān)于HTTPResponse 在下面 會(huì)講解。
HTTPConnection.connect ()
連接到Http 服務(wù)器。
HTTPConnection.close ()
關(guān)閉與服務(wù)器的連接。
HTTPConnection.set_debuglevel ( level )
設(shè)置高度的級(jí)別。參數(shù)level 的默認(rèn)值為0 ,表示不輸出任何調(diào)試信息。
httplib.HTTPResponse
HTTPResponse表示服務(wù)器對(duì)客戶(hù)端請(qǐng)求的響應(yīng)。往往通過(guò)調(diào)用HTTPConnection.getresponse()來(lái)創(chuàng)建,它有如下方法和屬性:
HTTPResponse.read([amt])
獲取響應(yīng)的消息體。如果請(qǐng)求的是一個(gè)普通的網(wǎng)頁(yè),那么該方法返回的是頁(yè)面的html??蛇x參數(shù)amt表示從響應(yīng)流中讀取指定字節(jié)的數(shù)據(jù)。
HTTPResponse.getheader(name[, default])
獲取響應(yīng)頭。Name表示頭域(header field)名,可選參數(shù)default在頭域名不存在的情況下作為默認(rèn)值返回。
HTTPResponse.getheaders()
以列表的形式返回所有的頭信息。
HTTPResponse.msg
獲取所有的響應(yīng)頭信息。
HTTPResponse.version
獲取服務(wù)器所使用的http協(xié)議版本。11表示http/1.1;10表示http/1.0。
HTTPResponse.status
獲取響應(yīng)的狀態(tài)碼。如:200表示請(qǐng)求成功。
HTTPResponse.reason
返回服務(wù)器處理請(qǐng)求的結(jié)果說(shuō)明。一般為”O(jiān)K”
下面通過(guò)一個(gè)例子來(lái)熟悉HTTPResponse中的方法:
#coding=gbk
import httplib
conn = httplib.HTTPConnection("www.g.cn", 80, False)
conn.request('get', '/', headers = {"Host": "www.google.cn",
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
"Accept": "text/plain"})
res = conn.getresponse()
print 'version:', res.version
print 'reason:', res.reason
print 'status:', res.status
print 'msg:', res.msg
print 'headers:', res.getheaders()
#html
#print '\n' + '-' * 50 + '\n'
#print res.read()
conn.close()
Httplib模塊中還定義了許多常量,如:
Httplib. HTTP_PORT 的值為80,表示默認(rèn)的端口號(hào)為80;
Httplib.OK 的值為200,表示請(qǐng)求成功返回;
Httplib. NOT_FOUND 的值為40表示請(qǐng)求的資源不存在;
可以通過(guò)httplib.responses 查詢(xún)相關(guān)變量的含義,如:
Print httplib.responses[httplib.NOT_FOUND]
6.3.4 mechanize
mechanize沒(méi)有找到比較完整的介紹,自己寫(xiě)了一個(gè)簡(jiǎn)單的例子如下。
# -*- coding: cp936 -*-
import time,string
import mechanize,urllib
from mechanize import Browser
urlname=urllib.quote('馬伊琍')
br=Browser()
br.set_handle_robots(False) ##ignore the robots.txt
urlhttp=r'http://www.baidu.com/s?'+urlname+"&pn=10&rn=20&ie=utf-8&usm=4&rsv_page=1"
response=br.open(urlhttp)
filename='temp.html'
f=open(filename,'w')
f.write(response.read())
f.close()
- python網(wǎng)絡(luò)編程之TCP通信實(shí)例和socketserver框架使用例子
- Python 網(wǎng)絡(luò)編程起步(Socket發(fā)送消息)
- python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶(hù)端、UDP廣播例子)
- python socket網(wǎng)絡(luò)編程步驟詳解(socket套接字使用)
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(三):socket網(wǎng)絡(luò)服務(wù)器
- python網(wǎng)絡(luò)編程實(shí)例簡(jiǎn)析
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(八):XML生成與解析(DOM、ElementTree)
- 用Python進(jìn)行TCP網(wǎng)絡(luò)編程的教程
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(九):數(shù)據(jù)庫(kù)客戶(hù)端 DB-API
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(二):socket建立網(wǎng)絡(luò)客戶(hù)端
- python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
- Python簡(jiǎn)單網(wǎng)絡(luò)編程示例【客戶(hù)端與服務(wù)端】
相關(guān)文章
Python 從subprocess運(yùn)行的子進(jìn)程中實(shí)時(shí)獲取輸出的例子
今天小編就為大家分享一篇Python 從subprocess運(yùn)行的子進(jìn)程中實(shí)時(shí)獲取輸出的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08使用FFmpeg來(lái)無(wú)損壓縮視頻文件的操作方法
FFmpeg是業(yè)內(nèi)有名的開(kāi)源圖像視頻處理程序,在許多視頻剪輯軟件、圖像處理軟件中,都使用的FFmpeg,還有比如OBS這樣的導(dǎo)播軟件里面也使用了FFmpeg,FFmpeg的功能十分強(qiáng)大,遠(yuǎn)不止視頻壓縮的功能,本文介紹使用FFmpeg來(lái)無(wú)損壓縮視頻文件的操作方法,感興趣的朋友一起看看吧2023-12-12python實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲(pygame版)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)pygame版的飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02python入門(mén)for循環(huán)嵌套理解學(xué)習(xí)
這篇文章主要介紹了python入門(mén)關(guān)于for循環(huán)嵌套的理解學(xué)習(xí),希望大家可以學(xué)會(huì)并運(yùn)用到日常工作中,有需要的朋友可以借鑒參考下,希望能夠有幫助2021-09-09Python獲取網(wǎng)絡(luò)圖片和視頻的示例代碼
Python 是一種多用途語(yǔ)言,廣泛用于腳本編寫(xiě)。我們可以編寫(xiě)Python 腳本來(lái)自動(dòng)化日常事務(wù)。本文將用Python實(shí)現(xiàn)獲取Google圖片和YouTube視頻,需要的可以參考一下2022-03-03python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想
這篇文章主要介紹了python 計(jì)算數(shù)組中每個(gè)數(shù)字出現(xiàn)多少次--“Bucket”桶的思想,需要的朋友可以參考下2017-12-12