㈠ python怎麼響應後端發送get,post請求的介面
測試用CGI,名字為test.py,放在apache的cgi-bin目錄下:
#!/usr/bin/Python
import cgi
def main():
print "Content-type: text/html
"
form = cgi.FieldStorage()
if form.has_key("ServiceCode") and form["ServiceCode"].value != "":
print "<h1> Hello",form["ServiceCode"].value,"</h1>"
else:
print "<h1> Error! Please enter first name.</h1>"
main()
python發送post和get請求
get請求:
使用get方式時,請求數據直接放在url中。
方法一、
import urllib
import urllib2
url = "http://192.168.81.16/cgi-bin/python_test/test.py?ServiceCode=aaaa"
req = urllib2.Request(url)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import httplib
url = "http://192.168.81.16/cgi-bin/python_test/test.py?ServiceCode=aaaa"
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="GET",url=url)
response = conn.getresponse()
res= response.read()
print res
post請求:
使用post方式時,數據放在data或者body中,不能放在url中,放在url中將被忽略。
方法一、
import urllib
import urllib2
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
req = urllib2.Request(url = requrl,data =test_data_urlencode)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import urllib
import httplib
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
headerdata = {"Host":"192.168.81.16"}
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
response = conn.getresponse()
res= response.read()
print res
對python中json的使用不清楚,所以臨時使用了urllib.urlencode(test_data)方法;
模塊urllib,urllib2,httplib的區別
httplib實現了http和https的客戶端協議,但是在python中,模塊urllib和urllib2對httplib進行了更上層的封裝。
介紹下例子中用到的函數:
1、HTTPConnection函數
httplib.HTTPConnection(host[,port[,stict[,timeout]]])
這個是構造函數,表示一次與伺服器之間的交互,即請求/響應
host 標識伺服器主機(伺服器IP或域名)
port 默認值是80
strict 模式是False,表示無法解析伺服器返回的狀態行時,是否拋出BadStatusLine異常
例如:
conn = httplib.HTTPConnection("192.168.81.16",80) 與伺服器建立鏈接。
2、HTTPConnection.request(method,url[,body[,header]])函數
這個是向伺服器發送請求
method 請求的方式,一般是post或者get,
例如:
method="POST"或method="Get"
url 請求的資源,請求的資源(頁面或者CGI,我們這里是CGI)
例如:
url="http://192.168.81.16/cgi-bin/python_test/test.py" 請求CGI
或者
url="http://192.168.81.16/python_test/test.html" 請求頁面
body 需要提交到伺服器的數據,可以用json,也可以用上面的格式,json需要調用json模塊
headers 請求的http頭headerdata = {"Host":"192.168.81.16"}
例如:
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
headerdata = {"Host":"192.168.81.16"}
conn = httplib.HTTPConnection("192.168.81.16",80)
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
conn在使用完畢後,應該關閉,conn.close()
3、HTTPConnection.getresponse()函數
這個是獲取http響應,返回的對象是HTTPResponse的實例。
4、HTTPResponse介紹:
HTTPResponse的屬性如下:
read([amt]) 獲取響應消息體,amt表示從響應流中讀取指定位元組的數據,沒有指定時,將全部數據讀出;
getheader(name[,default]) 獲得響應的header,name是表示頭域名,在沒有頭域名的時候,default用來指定返回值
getheaders() 以列表的形式獲得header
例如:
date=response.getheader('date');
print date
resheader=''
resheader=response.getheaders();
print resheader
列形式的響應頭部信息:
[('content-length','295'),('accept-ranges','bytes'),('server','Apache'),('last-modified','Sat,31Mar201210:07:02GMT'),('connection','close'),('etag','"e8744-127-4bc871e4fdd80"'),('date','Mon,03Sep201210:01:47GMT'),('content-type','text/html')]
date=response.getheader('date');
print date
取出響應頭部的date的值。
******************************************************************************************************************************************************************************************************************************************************
所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,保存到本地。
類似於使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內容發送到伺服器端, 然後讀取伺服器端的響應資源。
在Python中,我們使用urllib2這個組件來抓取網頁。
urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。
它以urlopen函數的形式提供了一個非常簡單的介面。
最簡單的urllib2的應用代碼只需要四行。
我們新建一個文件urllib2_test01.py來感受一下urllib2的作用:
import urllib2
response = urllib2.urlopen('http://www..com/')
html = response.read()
print html
按下F5可以看到運行的結果:
我們可以打開網路主頁,右擊,選擇查看源代碼(火狐OR谷歌瀏覽器均可),會發現也是完全一樣的內容。
也就是說,上面這四行代碼將我們訪問網路時瀏覽器收到的代碼們全部列印了出來。
這就是一個最簡單的urllib2的例子。
除了"http:",URL同樣可以使用"ftp:","file:"等等來替代。
HTTP是基於請求和應答機制的:
客戶端提出請求,服務端提供應答。
urllib2用一個Request對象來映射你提出的HTTP請求。
在它最簡單的使用形式中你將用你要請求的地址創建一個Request對象,
通過調用urlopen並傳入Request對象,將返回一個相關請求response對象,
這個應答對象如同一個文件對象,所以你可以在Response中調用.read()。
我們新建一個文件urllib2_test02.py來感受一下:
import urllib2
req = urllib2.Request('http://www..com')
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
可以看到輸出的內容和test01是一樣的。
urllib2使用相同的介面處理所有的URL頭。例如你可以像下面那樣創建一個ftp請求。
req = urllib2.Request('ftp://example.com/')
在HTTP請求時,允許你做額外的兩件事。
1.發送data表單數據
這個內容相信做過Web端的都不會陌生,
有時候你希望發送一些數據到URL(通常URL與CGI[通用網關介面]腳本,或其他WEB應用程序掛接)。
在HTTP中,這個經常使用熟知的POST請求發送。
這個通常在你提交一個HTML表單時由你的瀏覽器來做。
並不是所有的POSTs都來源於表單,你能夠使用POST提交任意的數據到你自己的程序。
一般的HTML表單,data需要編碼成標准形式。然後做為data參數傳到Request對象。
編碼工作使用urllib的函數而非urllib2。
我們新建一個文件urllib2_test03.py來感受一下:
import urllib
import urllib2
url = 'http://www.someserver.com/register.cgi'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
data = urllib.urlencode(values) # 編碼工作
req = urllib2.Request(url, data) # 發送請求同時傳data表單
response = urllib2.urlopen(req) #接受反饋的信息
the_page = response.read() #讀取反饋的內容
如果沒有傳送data參數,urllib2使用GET方式的請求。
GET和POST請求的不同之處是POST請求通常有"副作用",
它們會由於某種途徑改變系統狀態(例如提交成堆垃圾到你的門口)。
Data同樣可以通過在Get請求的URL本身上面編碼來傳送。
import urllib2
import urllib
data = {}
data['name'] = 'WHY'
data['location'] = 'SDU'
data['language'] = 'Python'
url_values = urllib.urlencode(data)
print url_values
name=Somebody+Here&language=Python&location=Northampton
url = 'http://www.example.com/example.cgi'
full_url = url + '?' + url_values
data = urllib2.open(full_url)
這樣就實現了Data數據的Get傳送。
2.設置Headers到http請求
有一些站點不喜歡被程序(非人為訪問)訪問,或者發送不同版本的內容到不同的瀏覽器。
默認的urllib2把自己作為「Python-urllib/x.y」(x和y是Python主版本和次版本號,例如Python-urllib/2.7),
這個身份可能會讓站點迷惑,或者乾脆不工作。
瀏覽器確認自己身份是通過User-Agent頭,當你創建了一個請求對象,你可以給他一個包含頭數據的字典。
下面的例子發送跟上面一樣的內容,但把自身模擬成Internet Explorer。
(多謝大家的提醒,現在這個Demo已經不可用了,不過原理還是那樣的)。
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
以上就是python利用urllib2通過指定的URL抓取網頁內容的全部內容,非常簡單吧,希望對大家能有所幫助
㈡ 安裝Python模塊錯誤問題,怎麼解決
前言:
這幾天把python版本升級後,發現pip安裝模塊好多都報錯(暫不確定是不是因為升級導致的),我定睛一看,發現是許可權的問題,那麼怎麼解決呢?
1 許可權問題
5 我們此時再看看自己pip,是不是能夠安裝模塊了。
㈢ Python+requests 爬取網站遇到中文亂碼怎麼辦
1. 遇到的中文亂碼問題
1.1 簡單的開始
使用requests來拔取網站內容十分方便,一個最簡單的代碼段只需要2-3行代碼就行。
點擊(此處)折疊或打開
url='http//www.pythonscraping.com/'
req= requests.get(url)
print(req.text)
tree= html.fromstring(req.text)
print(tree.xpath("//h1[@class='title']/text()"))
點擊(此處)折疊或打開
url='http://sports.sina.com.cn/g/premierleague/index.shtml'
print(tree.xpath("//span[@class='sec_blk_title']/text()"))
點擊(此處)折疊或打開
print(req.headers['content-type'])
print(req.encoding)
print(req.apparent_encoding)
print(requests.utils.get_encodings_from_content(page_content.text))
點擊(此處)折疊或打開
if req.encoding=='ISO-8859-1':
encodings= requests.utils.get_encodings_from_content(req.text)
if encodings:
encoding= encodings[0]
else:
encoding= req.apparent_encoding
encode_content= req.content.decode(encoding,'replace').encode('utf-8','replace')
㈣ python:Request的函數是什麼作用
你說的是
1
「class Request( url[, data][, headers] [, origin_req_host][, unverifiable]) 」吧。
這是一個類阿。是提取url中的信息的阿
「This class is an abstraction of a URL request.」
就像你在網路裡面搜索「python」一樣。
用戶點完enter鍵觸發。
這時候
URL = "http://www..com/s?wd=python"
Request(URL)
這樣就生成了一個類。你就可以用他來解析用戶需求。
2
request( method, url[, body[, headers]])
This will send a request to the server using the HTTP request method method and the selector url. If the body argument is present, it should be a string of data to send after the headers are finished. The header Content-Length is automatically set to the correct value. The headers argument should be a mapping of extra HTTP headers to send with the request.
㈤ python 能獲取網頁的網路請求嗎
(一)通過GET和POST方式獲取頁面內容
網路爬蟲,即Web Spider,是一個很形象的名字。
把互聯網比喻成一個蜘蛛網,那麼Spider就是在網上爬來爬去的蜘蛛。
HTTP協議中定義了四個與伺服器進行交互的方法,分別是GET, POST,PUT,DELETE ,實際對應對伺服器內容的「增」刪「改」查「四個操作
本篇文章主要記錄我學習GET和POST請求方式的過程
首先,如何區分GET 和POST請求?
我們可以簡單地通過瀏覽器地址欄是否改變來加以區分。舉例說明,在網路上搜索CSDN時,頁面會跳轉到搜索結果頁,同時瀏覽器上方的URL也會發生改變。
如上圖所示,變化就在於,在最初的url後面會附加相關的欄位,以?分割url和請求的數據,這些數據就是你要查詢欄位的編碼。。而這個過程,就是典型的GET請求的情況。
POST請求則顯得」深藏不露「。它在於你必須通過瀏覽器輸入或提交一些伺服器需要的數據,才能給你返回完整的界面,這點其實與GET請求情況有相通之處,但是這個過程瀏覽器的地址欄是不會發生跳轉的。
那POST請求提交的數據是如何傳給伺服器的呢?可以採用一些分析頁面的手段來獲取上傳的數據。實際上,POST請求是將提交的數據放在HTTP包的包體中,這種方式無疑加強了數據的安全性,不像GET請求那樣,用戶可以通過跳轉的url就可以查看出向伺服器發送的數據。另外,POST請求除了提交數據外,還可以提交文件,這點也是GET請求做不到的。
總的來說,在做數據查詢時,建議用GET方式;而在做數據添加、修改或刪除時,建議用POST方式。
下面用具體代碼展示GET與POST方式的差異
#coding =utf-8import urllib2
url="httcom"req=urllib2.Request(url)#req表示向伺服器發送請求#response=urllib2.urlopen(req)#response表示通過調用urlopen並傳入req返回響應response#the_page=response.read()#用read解析獲得的HTML文件#print the_page#在屏幕上顯示出來#1234567
這是一個最簡單的爬蟲程序,功能類似於打開網路主頁。如果你此時用瀏覽器打開網路並查看其源代碼,會發現屏幕上的內容和瀏覽器中完全一樣,也就是說,上面這四行代碼將我們訪問網路時瀏覽器收到的代碼們全部列印了出來。
這就是一個最簡單的GET的例子。
再來看一個POST方式的例子
#code=utf-8import urllib2
import urllib
url='http'//把要發送的數據寫成字典value={ 'name':'BUPT', 'age':'60', 'location':'Beijing'#字典中的內容隨意,不影響#}
data=urllib.urlencode(value)#對value進行編碼,轉換為標准編碼#req=urllib2.Request(url,data)#向url發送請求,並傳送表單data#response=urllib2.urlopen(req)#獲取響應#the_page=response.read()#解析#print the_page#顯示#123456789101112131415
程序運行之後,你可以試試將獲取的網頁源代碼用瀏覽器打開,會發現得到的頁面是這樣的
因為我們向網站提供的數據是隨便寫的,並不存在,所以就會得到這樣的結果。
㈥ python怎麼驗證post數據有效
首先python中請求參數是一個Dict
urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。他以urlopen函數的形式提供了一個非常簡單的介面
import urllib,urllib2
2
GET方法:
對請求參數dict進行urlencode,然後直接拼到請求的url中,獲得帶參數的url
req_url = url+'?'+urllib.urlencode( data )
resp = urllib2.urlopen( req_url )
3
POST方法:
需要使用urllib2.Request對urlencode後的參數和請求url連接起來
req_url = urllib2.Request(url, urllib.urlencode( data ));
resp = urllib2.urlopen( req_url )
4
我們使用debug來看下request中信息
get請求時,在query_params中可以看到請求的參數
5
post請求時,在_data,_full_data,data 中都可以看到請求的參數
6
GET:
request.query_params
request.query_params.get('instry_id')
request.REQUEST.get('instry_id')
POST:
request._datarequest._full_datarequest.datarequest.data['instry_id']request.data.get('instry_id')request._data['instry_id']request._data.get('instry_id')request._full_data['instry_id']request._full_data.get('instry_id')
㈦ python如何提取網頁信息
requests庫+ 正則表達式/dom庫/xpath庫等
㈧ python無法輸出結果
python函數參數為None的時候,比如 def req(self, b=None),是因為這個函數是一個封裝函數,在沒有調用他的時候他的參數需要加上None。如果不加None值,不調用函數他會報錯。 一般會用在封裝類或者框架里。比如說框架一般會有一個總的調用函數,總的調用函數啟動,這次沒有獲取到值,執行到req函數時無法給req函數參數,那如果沒有參數req函數就會報錯。一般會報:『req() missing 1 required positional argument: 'b'』但是如果參數為None就不會報錯。如果程序執行到req參數傳遞成功的話,參數就不會是None了。 所以None是一個防止報錯的機制。
㈨ 怎麼知道python發送了什麼http請求
本文實例講述了python通過get,post方式發送http請求和接收http響應的方法。分享給大家供大家參考。具體如下:
測試用CGI,名字為test.py,放在apache的cgi-bin目錄下:
#!/usr/bin/python
import cgi
def main():
print "Content-type: text/html\n"
form = cgi.FieldStorage()
if form.has_key("ServiceCode") and form["ServiceCode"].value != "":
print "<h1> Hello",form["ServiceCode"].value,"</h1>"
else:
print "<h1> Error! Please enter first name.</h1>"
main()
python發送post和get請求
get請求:
使用get方式時,請求數據直接放在url中。
方法一、
import urllib
import urllib2
url = "test.py?ServiceCode=aaaa"
req = urllib2.Request(url)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import httplib
url = "hest/test.py?ServiceCode=aaaa"
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="GET",url=url)
response = conn.getresponse()
res= response.read()
print res
post請求:
使用post方式時,數據放在data或者body中,不能放在url中,放在url中將被忽略。
方法一、
import urllib
import urllib2
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "/python_test/test.py"
req = urllib2.Request(url = requrl,data =test_data_urlencode)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import urllib
import httplib
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "python_test/test.py"
headerdata = {"Host":"116"}
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
response = conn.getresponse()
res= response.read()
print res
對python中json的使用不清楚,所以臨時使用了urllib.urlencode(test_data)方法;
模塊urllib,urllib2,httplib的區別
httplib實現了http和https的客戶端協議,但是在python中,模塊urllib和urllib2對httplib進行了更上層的封裝。
介紹下例子中用到的函數:
1、HTTPConnection函數
httplib.HTTPConnection(host[,port[,stict[,timeout]]])
這個是構造函數,表示一次與伺服器之間的交互,即請求/響應
host 標識伺服器主機(伺服器IP或域名)
port 默認值是80
strict 模式是False,表示無法解析伺服器返回的狀態行時,是否拋出BadStatusLine異常
例如:
conn = httplib.HTTPConnection("1.16",80) 與伺服器建立鏈接。
2、HTTPConnection.request(method,url[,body[,header]])函數
這個是向伺服器發送請求
method 請求的方式,一般是post或者get,
例如:
method="POST"或method="Get"
url 請求的資源,請求的資源(頁面或者CGI,我們這里是CGI)
例如:
url="htti-bin/python_test/test.py" 請求CGI
或者
url="ht_test/test.html" 請求頁面
body 需要提交到伺服器的數據,可以用json,也可以用上面的格式,json需要調用json模塊
headers 請求的http頭headerdata = {"Host":"192.168.81.16"}
例如:
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "hgi-bin/python_test/test.py"
headerdata = {"Host":"192.116"}
conn = httplib.HTTPConnection("196",80)
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
conn在使用完畢後,應該關閉,conn.close()
3、HTTPConnection.getresponse()函數
這個是獲取http響應,返回的對象是HTTPResponse的實例。
4、HTTPResponse介紹:
HTTPResponse的屬性如下:
read([amt]) 獲取響應消息體,amt表示從響應流中讀取指定位元組的數據,沒有指定時,將全部數據讀出;
getheader(name[,default]) 獲得響應的header,name是表示頭域名,在沒有頭域名的時候,default用來指定返回值
getheaders() 以列表的形式獲得header
例如:
date=response.getheader('date');
print date
resheader=''
resheader=response.getheaders();
print resheader
列形式的響應頭部信息:
[('content-length', '295'), ('accept-ranges', 'bytes'), ('server', 'Apache'), ('last-modified', 'Sat, 31 Mar 2012 10:07:02 GMT'), ('connection', 'close'), ('etag', '"e8744-127-4bc871e4fdd80"'), ('date', 'Mon, 03 Sep 2012 10:01:47 GMT'), ('content-type', 'text/html')]
date=response.getheader('date');
print date
取出響應頭部的date的值。