認識 httpbin 網站
認識 httpbin 網站
前言
httpbin 是一個 HTTP Request & Response Service 的網站,可以想像成一個功能強大的網路爬蟲 Echo 回答服務器。以下用範例介紹其使用方法:
大綱
HTTP 方法 : get()
範例 pythonHttpbin-01.py : 列出 get() 方法的網址
# pythonHttpbin-01.py import requests url = 'https://www.httpbin.org/get' response = requests.get(url) print(type(response)) print(response.url)
執行結果
<class 'requests.models.Response'>
https://www.httpbin.org/get
範例 pythonHttpbin-02.py : 有一些網站登入時需要些參數,當我們使用網路爬蟲登入時需要設定這些參數才可以進入此網頁,可使用 get() 內設定這些參數 params ,編程時可以使用字典設計此參數
# pythonHttpbin-02.py
import requests
url = 'https://www.httpbin.org/get'
form_data = {'gender':'M','page':'1'}
response = requests.get(url, params=form_data)
print(response.url)
執行結果
https://www.httpbin.org/get?gender=M&page=1
HTTP 方法 : post()
範例 pythonHttpbin-03.py : 使用網路爬蟲登入時可能在登入時時同時會發送表單數據,表單格式可能是JSON或字典,post() 方法內有參數 data 可以設定此參數。
# pythonHttpbin-03.py
import requests
url = 'https://www.httpbin.org/post'
form_data = {'gender':'M','page':'1'}
response = requests.post(url, data=form_data)
print(response.url)
print('-'*70)
print(response.text)
執行結果
https://www.httpbin.org/post
----------------------------------------------------------------------
{
"args": {},
"data": "",
"files": {},
"form": {
"gender": "M",
"page": "1"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "15",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-615a9b44-56a767ae14d45cf348bd06aa"
},
"json": null,
"origin": "180.177.109.201",
"url": "https://www.httpbin.org/post"
}
範例 pythonHttpbin-04.py : 延續 範例 pythonHttpbin-03.py ,將發送數據改為 JSON 格式。
# pythonHttpbin-04.py
import requests, json
url = 'https://www.httpbin.org/post'
form_data = {'gender':'M','page':'1'}
response = requests.post(url, data=json.dumps(form_data))
print(response.url)
print('-'*70)
print(response.text)
執行結果
https://www.httpbin.org/post
----------------------------------------------------------------------
{
"args": {},
"data": "{\"gender\": \"M\", \"page\": \"1\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "28",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-615a9da4-35fe181b3875ce7978be390b"
},
"json": {
"gender": "M",
"page": "1"
},
"origin": "180.177.109.201",
"url": "https://www.httpbin.org/post"
}
範例 pythonHttpbin-05.py : 延續 範例 pythonHttpbin-04.py ,直接在 post() 方法內使用 json 參數 post(url, json=form_data)
# pythonHttpbin-05.py
import requests, json
url = 'https://www.httpbin.org/post'
form_data = {'gender':'M','page':'1'}
response = requests.post(url, json=form_data)
print(response.url)
print('-'*70)
print(response.text)
執行結果
https://www.httpbin.org/post
----------------------------------------------------------------------
{
"args": {},
"data": "{\"gender\": \"M\", \"page\": \"1\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "28",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-615a9da4-35fe181b3875ce7978be390b"
},
"json": {
"gender": "M",
"page": "1"
},
"origin": "180.177.109.201",
"url": "https://www.httpbin.org/post"
}
認識表頭 headers
在使用 get() 或 post() 時,有時需要加上 表頭 headers 偽裝瀏覽器,此表頭也是使用字典格式,我們可以使用 request.headers 屬性列出請求的表頭內容,伺服器所返回的表頭內容可以使用 headers 屬性列出表頭內容。
範例 pythonHttpbin-06.py : 使用 requests.headers 和 headers 屬性 列出我們傳遞的表頭和伺服器回傳的表頭內容。
# pythonHttpbin-06.py
import requests, json
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101\
Safari/537.36', }
url = 'https://www.httpbin.org/post'
form_data = {'gender':'M','page':'1'}
r = requests.post(url, json=form_data, headers=headers)
print(r.url)
print('-'*70)
print('r.request.headers :\n', r.request.headers)
print('-'*70)
print('r.headers :\n', r.headers)
執行結果
https://www.httpbin.org/post
----------------------------------------------------------------------
r.request.headers :
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '28', 'Content-Type': 'application/json'}
----------------------------------------------------------------------
r.headers :
{'Date': 'Mon, 04 Oct 2021 09:03:40 GMT', 'Content-Type': 'application/json', 'Content-Length': '633', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
HTTP的回應數據
當我們使用 requests.get() 或 requests.post() 或其他方法向伺服器發出請求時,Requests 模組執行了兩件事情:
建立一個 request 的物件,該物件會依據所使用的方法和相關參數發起 http 的請求。
當伺服器有回應時,會建立一個 Response 物件。這個物件內容除了有我們原先建立的 Response 物件,也包含伺服器傳回的所有訊息。
下列是幾個伺服器回應的主要屬性內容
- status_code : 正常回應時此內碼的值是200
- reason : 回應正常時,內容是OK
- 編碼方式 encoding : 這個屬性可以列出伺服器回應內文的編碼方式。
- 回應內文 text : 可以使用 text 屬性獲得內容。
範例 pythonHttpbin-07.py : 列出回應的 status_code 狀態碼 和 reason 理由。
# pythonHttpbin-07.py import requests url = 'https://www.httpbin.org/get' r = requests.get(url) print(r.status_code) print(r.reason)
執行結果
200 OK
範例 pythonHttpbin-08.py : 列出部分HTML內文
# pythonHttpbin-07.py import requests url = 'https://www.httpbin.org/get' r = requests.get(url) print(r.status_code) print(r.reason)
執行結果
utf-8
----------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>Herman Melville - Moby-Dick</h1>
範例 pythonHttpbin-09.py : 回應數據是 JSON 格式,將內容轉換成 Python 物件
# pythonHttpbin-09.py
import requests
url = 'https://www.httpbin.org/response-headers?freeform='
r = requests.get(url)
if r.status_code == 200:
print(r.headers.get('content-type'))
print('-'*70)
print(r.json())
執行結果
application/json
----------------------------------------------------------------------
{'Content-Length': '87', 'Content-Type': 'application/json', 'freeform': ''}
範例 pythonHttpbin-10.py : 回應或下載數據是影音、圖片,則程式所獲得的是二進位格式的內容,可以使用 content 屬性舉得此內容。
# pythonHttpbin-10.py
import requests
url = 'https://www.httpbin.org/image/jpeg'
response = requests.get(url)
img = response.content
fileName = 'output-pythonHttpbin-10.jpg'
with open(fileName, 'wb') as outFile:
outFile.write(img)
執行結果
![]() |
| output-pythonHttpbin-10.jpg |
參考資料
特色、摘要,Feature、Summary:
關鍵字、標籤,Keyword、Tag:
- Web-Crawler,Data-Mining,Data-Science,

留言
張貼留言
Aron阿龍,謝謝您的留言互動!