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()
で文字列が返ってくると思いこみファイルのopen
のmode
をw
にしたところTypeError: write() argument must be str, not bytes
と叱られてしまいました。
type()
関数で型を確認したところclass 'bytes'
と戻ってきました。
バイナリのようなのでopen
のmode
をwb
にすると保存できました。
ファイルに保存するにはこれ良いですが、文字列として加工したい場合何らかの形で変換する必要があります。ちょっと面倒です。
逆に考えるとバイナリですので同じルーチンで画像ファイルなどの保存もできます。
事前にURLからコンテンツの種類を特定できない場合が多いので、コンテンツを取得してみてレスポンスのコンテンツタイプを確認する必要があります。
実装時とりあえずバイナリで取得したファイルに保存しておき、後からコンテンツタイプに沿った加工をする手順踏むことを考えると、バイナリが返ってくるほうが理にかなっているかもしれません。
また、文字列として加工することを考えましたが、よく考えるとBeautifulSoupなどでHTMLをParse出来るのであればrespose.read()
の型が何であろうと問題ないことに気が付きました。
コメント