前回の正規表現の例で、Yahoo!ニュースのRSSをそのままコピペして使いましたが、通常このようなことはしません。
プログラムから直接、指定したURLにアクセスして、そのページのソースコードを取得し、それを変数に代入して使用します。
そういうことを簡単にできるライブラリが「Requests」です。
Requestsの詳しい説明は、http://requests-docs-ja.readthedocs.io/en/latest/を参照して下さい。
RequestsはPythonとは別にインストールしなければいけませんが、とても簡単です。
Requestsのインストール方法
コマンドプロンプトを起動して、
pip install requests
と入力してEnterです。
Pythonをインストールしていれば、pipと呼ばれるPythonのパッケージソフトウェアもインストールされていますので、上記コマンドが実行されます。
Requestsを使ってみる
Requestsモジュールをインポートして利用します。
1 2 3 4 |
import requests r = requests.get("https://liveinhope.biz/feed") print(r.text) |
ライブインホープのRSSを指定して、そのソースコードを表示しています。
結果は長いソースコードの羅列ですので割愛しますが、たったこれだけのコードで、指定したURLのソースコードを取得できます。
前回やった正規表現のfindallの例をRequestsでやってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import re import requests r = requests.get("https://liveinhope.biz/feed") rss = r.text pattern = r"<item>.*?<title>(.*?)</title>.*?<link>(.*?)</link>.*?</item>" a = re.findall(pattern, rss, flags=(re.MULTILINE | re.DOTALL)) if a: for title, link in a: print(title) print(link) else: print("ありません") |
結果はブログの更新によって変わりますので割愛します。
RSSリーダーもこのような感じで作ることが可能です。
リファラやユーザーエージェント情報を追加
リファラは、指定したURLに来る前の、リンク元ページのURLです。
ユーザーエージェントは、アクセスに使ったブラウザ情報です。
これらがないと、うまくアクセス出来ない場合もありますので、追加することも出来ます。
1 2 3 4 |
r = requests.get("https://liveinhope.biz/feed", headers={"referer": "https://www.google.co.jp/", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; rv:11.0) like Gecko"}, ) |
例外処理
Requestsは、インターネットに接続するので、ネットワークやタイムアウト等のエラーが出る場合があります。
エラーが出るとプログラムが止まってしまうので、それを防ぐために例外処理は書いた方がいいです。
例外処理は、try~exceptを使います。
下の例は、Accept-Language(ブラウザの言語指定)やtimeout(秒で指定)も追加しています。
1 2 3 4 5 6 7 8 9 10 11 |
try: r = requests.get("https://liveinhope.biz/feed", headers={"referer": "https://www.google.co.jp/", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; rv:11.0) like Gecko", "Accept-Language": "ja,en-US;q=0.7,en;q=0.3"}, timeout=15 ) print(r.text) except Exception as e: print("エラー:", e.args) |
except Exception as e ~は、すべての例外の補足を試みていますが、どのようなエラーなのかは具体的に書いた方がいいみたいです。