PythonでWebページを読み出す(その2)

技術情報

以前作ったPythonスクリプトを改造し、WebページのURLを指定できるようにしてみました。興味のある方はごらんください。 コードの使用・改造・流用は、ご自由にどうぞ。

Webページ本体を取得するPythonスクリプト

まずWebページ本体を取得するスクリプトです。ファイル名を「webget.py」とします。

from urllib.request import urlopen
from sys import argv, stdout
from re import search, I

try:
    if (len(argv) >= 3) and (argv[1] == "-b"):
        url = argv[2]
        mode = "bin"
    elif len(argv) >= 2:
        url = argv[1]
        mode = "text"
    else:
        print("Usage: webget [-b] URL")
        print("  -b : force binary mode")
        exit(0)

    web = urlopen(url)
    mediatype = web.getheader("content-type")
    data = web.read()
    web.close()

    if mediatype.startswith("text/") and (mode == "text"):
        match = search(r'charset\s*=\s*(.*)', mediatype, flags=I)
        charset = match.group(1) if match else "utf-8"
        text = data.decode(charset, errors="ignore")
        print(text, end="")
    else:
        stdout.buffer.write(data)

except Exception as ex:
    print(ex.__class__.__name__, ":", ex)

使い方は、次のようにコマンドライン引数としてURLを指定します。

C>py webget.py https://webservice.tokyo/p/ip.php
157.7.107.131

いろいろなタイプのデータを取得できるように、Content-Typeヘッダでテキストとバイナリを振り分けています。

テキストデータはContent-Typeのcharsetをチェックすることで、適切な文字コード変換を加えて文字列化します。

バイナリは生のデータをそのまま出力するので、画像なども次のようにファイルに書き込むことで、きちんと取得できます。

C>py webget.py https://webservice.tokyo/p/ok-robo.png > ok-robo.png

またテキストであっても 「-b」オプションを指定すると、文字コードをいじらない生のデータを出力します。これは文字コードの自動判定が失敗し文字化けするときのチェックなどに利用できます。

C>py webget.py -b https://webservice.tokyo/p/euc-jp.txt > euc-jp.txt

HTTPヘッダを取得するPythonスクリプト

2つめは、WebページのHTTPヘッダを表示するスクリプトです。こちらのファイル名を「webhead.py」とします。

from urllib.request import urlopen
from sys import argv

try:
    if len(argv) < 2:
        print("Usage: webhead URL\n")
        exit(0)

    url = argv[1]
    web = urlopen(url)
    headers = web.getheaders()
    web.close()

    for (key, val) in headers:
        print(key, ":", val)

except Exception as ex:
    print(ex.__class__.__name__, ":", ex)

こちらも次のようにコマンドライン引数でURLを指定するだけです。


C>py webhead.py https://webservice.tokyo/p/ip.php
Date : Sun, 16 Feb 2020 08:49:52 GMT
Content-Type : text/html; charset=UTF-8
Content-Length : 15
Connection : close
X-Powered-By : PHP/7.3.10
Vary : Range
Accept-Ranges : none
Server : Apache

スクリプトをgithubで公開します

このコーナーで紹介したスクリプトを保存するため、 github にファイル置き場を作ってみました。興味のある方は次のリンクからソースコードを落としてください。

今後このコーナーで作るミニプログラムは、そのたびに上記のguthubリポジトリに追加していきますので、ときどきチェックしてみてください。

技術情報

今回のPythonスクリプトに関する備忘メモをここに書く予定です。

コメント

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