認識 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,

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組