Python3 requestsによるデータの取得

Python3

 requestは標準でSSLに対応していませんが、requestsは標準で対応しています。ここでは、requestsをつかったデータの取り方と、最近普及しているWebAPIのデータの送受信について紹介します。私自身の備忘録も兼ねていますので、詳細な解説よりも、できるだけ簡単に(コピペだけで)目的が達成できるように書いていきます。

1.必要なライブラリ

requestsをインストールします。私はパッケージ管理ソフトにpipを使っていますので以下のようにインストールします。

pip install requests

2.requestsを使ってデータを取得する

この例では、指定したurlからデータを読み取り、ファイルに保存しています。

import requests
url = 'https://www.*******/index.html'
file_path = 'D:\\etc\\usr\\sample.html'
data = requests.get(url).content
with open(file_path, "wb") as f:
    f.write(data)

3.ZIPファイルをダウンロードし展開して保存する

インターネット上のZIPファイルをダウンロードし、展開するスクリプトです。
指定したZIPファイルのURLから任意の場所にファイルをダウンロード&展開し、最後にzipファイルを削除します。

注意点があります。この標準のzipfileは内容物に日本語を含む場合、
ZIPファイルの文字コードを解釈できず正しく解凍できません。事前に日本語が含まれていないかチェックをしてから使ってください。

import requests
import zipfile
import os

filepath = "D:\\etc\\dw.zip"
extract_dir = "D:\\etc\\"
url = "https://****.***/***.zip"

r = requests.get(url, stream=True)
with open(filepath, 'wb') as f:
    for chunk in r.iter_content(chunk_size=1024):
        f.write(chunk)
    f.close()
    if zipfile.is_zipfile(filepath):
        with zipfile.ZipFile(filepath) as existing_zip:
            existing_zip.extractall(extract_dir)
            #展開後DLしたZIPファイルを消す場合はremoveを入れる。
            os.remove(filepath)
4.APIにXML形式のリクエストを送信しデータを受け取る

近年、WebAPIによるデータの送受信が普及してきましたのでXMLを使ったタイプのAPIについて紹介します。今回は、eBayのWebAPIを使用しています。このAPIを使用するには事前に登録が必要で使用開始まで5営業日程度かかります。
WebAPIを使用する場合、各サイトに利用登録しAPIキーを取得する必要がありますが、その方法についてはここでは割愛します。
eBayのAPIを使ってみたい方は下段にeBay Developerサイトのリンクを掲載していますので参考にしてください。

まずプロバイダ指定の形式の設定用XMLとヘッダー情報を作りそのデータを送信します。戻ってきたパラメータ(今回はXML形式)をBeautifulSoupを使ってxml形式のファイルを書き出しています。API戻り値はxml形式であるためパース用にBeautifulsoup4と内部で使用するlxmlをインストールします。JSON形式の戻り値の場合は必要ありません。

pip install beautifulsoup4
pip install lxml

import requests
from bs4 import BeautifulSoup

# 設定値
debug = True
requestURL = ""
app_id = ""
dev_id = ""
cert_id = ""
app_tolken = ""

#eBayでは本番用の環境と金銭の動かないSandBox環境がある。
#debug中はsandboxのAPIを使ってテストする。
if debug == False :
    #Production 用のAPI URL
    requestURL = "https://api.ebay.com/ws/api.dll"
    app_id = "your_app_id"
    dev_id = "your_dev_id"
    cert_id = "your_cert_id"
    app_tolken = "your_app_tolken"
else :
    #Sandbox用のAPI URL
    requestURL = "https://api.sandbox.ebay.com/ws/api.dll"
    app_id = "your_app_id"
    dev_id = "your_dev_id"
    cert_id = "your_cert_id"
    app_tolken = "your_app_tolken"

#XMLは、各サイトの仕様に応じて設定する。
#ebayのGetSellerTransactionsRequestというAPIを使う場合以下のBodyを設定する。
xmlPostBody = """
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<GetSellerTransactionsRequest xmlns=\"urn:ebay:apis:eBLBaseComponents\">
  <RequesterCredentials>
    <eBayAuthToken>""" + app_tolken + """</eBayAuthToken>
  </RequesterCredentials>
</GetSellerTransactionsRequest>"""

#辞書形式でヘッダー情報を入れる。
headers = {}
headers["Content-type"] = "text/xml;"
headers["X-EBAY-API-COMPATIBILITY-LEVEL"] = "1179"
headers["X-EBAY-API-CALL-NAME"] = "GetSellerTransactions"
headers["X-EBAY-API-SITEID"] = "0"
headers["X-EBAY-API-DEV-NAME"] = dev_id
headers["X-EBAY-API-APP-NAME"] = app_id
headers["X-EBAY-API-CERT-NAME"] = cert_id

# POSTリクエスト送信
#XMLで指定した文字コードを設定しrequests.requestの引数に渡す。
bytesXMLPostBody = xmlPostBody.encode("UTF-8")
req = requests.request(url=requestURL, data=bytesXMLPostBody, headers=headers, method="POST")
#戻り値をtextデータに変換しBeautifulSoupで結果を解析する。
soup = BeautifulSoup(req.text, "lxml")
#1行1タグに整形する。
xml = soup.prettify("utf-8")
#結果をファイルに出力する。
with open("output1.xml", "wb") as file:
    file.write(xml)

eBay Developer Program:
https://developer.ebay.com/

eBay Developer Program API Document:
https://developer.ebay.com/docs/api-deprecation

BeautifulSoup 参考サイト:
https://www.inet-solutions.jp/technology/beautiful-soup-python/

コメント

タイトルとURLをコピーしました