PythonでWebページを取得しファイルとして書き込むサンプル

python コンピュータ

Webページをスクレイピングする場合、対象ページのHTMLを見る必要があり、Webブラウザでページのソースを見れば良さそうですがWebブラウザで表示される内容とPythonで取得した内容が異なる場合があります。
今回はPythonのurlopenでWebページを取得しファイルに保存してみたいと思います。

#!/usr/bin/env python3
# coding: utf8
# PythonでWebページを取得しファイルとして書き込むサンプル
url = "https://maywork.net/"
#url = "https://maywork.net/wp/wp-content/uploads/2018/10/logo.png"
local_path = "./index.html"
#local_path = "./logo.png"

import urllib.request

with urllib.request.urlopen(url) as response:
    html = response.read()

# print(type(html))
# <class 'bytes'>

with open(local_path, mode='wb') as f:
    f.write(html)

response.read()で文字列が返ってくると思いこみファイルのopenmodewにしたところTypeError: write() argument must be str, not bytesと叱られてしまいました。

type()関数で型を確認したところclass 'bytes'と戻ってきました。
バイナリのようなのでopenmodewbにすると保存できました。

ファイルに保存するにはこれ良いですが、文字列として加工したい場合何らかの形で変換する必要があります。ちょっと面倒です。
逆に考えるとバイナリですので同じルーチンで画像ファイルなどの保存もできます。

事前にURLからコンテンツの種類を特定できない場合が多いので、コンテンツを取得してみてレスポンスのコンテンツタイプを確認する必要があります。
実装時とりあえずバイナリで取得したファイルに保存しておき、後からコンテンツタイプに沿った加工をする手順踏むことを考えると、バイナリが返ってくるほうが理にかなっているかもしれません。

また、文字列として加工することを考えましたが、よく考えるとBeautifulSoupなどでHTMLをParse出来るのであればrespose.read()の型が何であろうと問題ないことに気が付きました。

コメント