認識 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阿龍,謝謝您的留言互動!