• 検索結果がありません。

Web から情報を取得する

ドキュメント内 NPCA部誌2018 (ページ 54-62)

第 5 章 ぱそこんであそぼ 46

5.5 Web から情報を取得する

字の可能性も考慮して使っています。

Cドライブからjpg画像を探すときは以下のようにします。

python(FindFile.p yの 絶 対 パ ス) C:// jpg

■コラム : 絶対パスと相対パス

今、C:\Usersを見ているします。C:\Users直下にnpca.pngというファイルがあるとすると、相対パスはnpca.png、絶 対パスはc:\Users\npca.pngとなります。このように、今見ているファイルからの相対的な位置を示すのが相対パス、今ど こを見ているかに関係なくファイルの位置を示すのが絶対パスです。

5.5 Web から情報を取得する

今、Web上には情報が溢れています。その大量の情報の中から、自分に必要なものだけを集めるという作業は、様々なことに活 用できます。

クローリング & スクレイピング

先に用語の解説をしておきます。

クローリング

Web上の情報を集めることをクローリング(Crawling)といいます。クローリングを行うプログラムはクローラーと呼ばれ ます。

スクレイピング

クローリングして集めてきた情報から必要なものを抜き出していく作業をスクレイピング(Scraping)といいます。

クローラーは、Googleの検索エンジンなど、私達の身近なところで用いられています。自分好みのクローラーを作れば、役に立 つこと間違いなしです。

ここでは、朝天気予報を見るのが億劫なので、https://tenki.jpという天気予報のサイトで日中の降水確率を取得し、特定の 割合より高ければメールでお知らせする、というツールを作ってみます。

目覚まし時計としてスマホを使っていれば朝必ずスマホを確認するので、天気予報のメールを送信して、スマホの通知でそれを 確認することにします。

天気予報メール

1 #! python3

2 # coding: utf-8 -*-3

4 importrequests 5 importbs4 6 importsmtplib

7 fromemail.mime.textimport MIMEText 8 fromemail.headerimport Header 9

10 percent= 70# 降 水 確 率 がpercentより高ければ雨の通知 11

12 url=requests.get(’https://tenki.jp/forecast/6/31/6310/28100/’) # 変 数u r lに 指 定 し たU R Lを ダ ウ ン ロ ー ド 13 parse= bs4.BeautifulSoup(url.text,"lxml")# 変 数parseにurlを解析して入れる lxmlはHTMLのパーサー 14 probability= parse.select(’.rain-probability’)[0]

15 if int(probability.select(’td’)[1].text[0]) >=percentor int(probability.select(’td’)[2].text[0]) >= percent:

16 letter =’今日は雨です’

17 else:

18 letter =’今日は傘は要りません’

19

20 charset=’iso-2022-jp’

21 message=MIMEText(letter,’plain’,charset)

22 message[’Subject’] =Header(’セルフ天気予報’.encode(charset), charset) 23 smtp_obj= smtplib.SMTP(’smtp.gmail.com’, 587)

24 smtp_obj.ehlo() 25 smtp_obj.starttls()

26 smtp_obj.login(’FROM’,’PASSWORD’)

27 smtp_obj.sendmail(’FROM’,’TO’,message.as_string())

第5章 ぱそこんであそぼ 5.5 Webから情報を取得する

28 smtp_obj.quit()

12~15行目でHTMLの解析、20~28行目でメールの送信をしています。

• requestsモジュール

webからファイルをダウンロードするためのモジュールです。

requests.get

指定したURLをダウンロードする関数です。

• bs4モジュール

bs4の正式名称はBeautifulSoup4です。BeautifulSoup4はHTMLを解析するためのモジュールです。

bs4.BeautifulSoup

指定したHTMLを解析(パース)します。lxmlはHTMLのパーサーのひとつです(pip install lxmlする必要があります)。

• smtplibモジュール

メールを送信するのに必要なモジュールです。SMTP(Simple Mail Transfer Protocol)は、メールを送信するためのプロトコル です。

smtplib.SMTP

メールサーバーに接続するための関数です。smptサーバー名とポート番号を指定する必要がありますが、ここでは、Gmailの smtpサーバーと、コマンドを暗号化するための規格TLSを使う587番を指定しています。

smtplib.ehlo、smtp_obj.starttls、smtp_obj.quit

サーバーとの接続を確立する関数、TLS通信を利用するための関数、サーバーから切断するための関数です。

smtp_obj.login

メールを送信する際の、メールアドレスとパスワードを指定します。このとき、Googleで、アプリケーション固有のパスワード を設定する必要があるかもしれません。https://support.google.com/accounts/answer/185833から詳しい説明を見るこ とが出来ます。

smtp_obj.sendmail

FROMに送信側のメールアドレス、TOに受信側のメールアドレスを指定します。最後にメッセージを入力します。

• MIMEText、Header、as_string

日本語のメールを送るために必要な関数です。本文にはMIMEText関数、ヘッダーにはHeader関数を利用します。

12~15行目のHTMLの解析について説明します。

tenki.jpは以下のような構成になっていますが、取得したいのは丸で囲んだ部分です。

第5章 ぱそこんであそぼ 5.5 Webから情報を取得する

図: tenki.jpの神戸市のページ

ページのソースを見ると(このメニューは右クリックやCtrl+Uで開けます)、取得したい部分はrain-probabilityというクラス 名を持っていることがわかるので、select関数で指定します(.〇〇とすると、「クラス名が〇〇」と指定することになります)。

図: tenki.jpのソース

第5章 ぱそこんであそぼ 5.5 Webから情報を取得する

rain-probabilityは2つありますが、取得したいのは当日の予報なので1つめを指定して、更にその中の4つのtd要素のうち通

学時間に関係のある2つめと3つめを指定します。またまたさらに、td要素は数値と’%’という文字を要素に持っているので、そ のうちの数値を指定します。

こうして取得した2つの数値(6~12時の降水確率と12~18時の降水確率)が変数percentの値より大きいか小さいかによって メールの本文を変えています。

あとは、このプログラムを朝7時くらいに自動で実行するようにしておけば、セルフ天気予報の完成です。

Windowsにはタスクスケジューラがあるので、それを使います。

.pyファイルは直接実行するだけではうまく動きません。なので、「.pyファイルを実行する」というバッチファイルを作る必要 があります。以下のようにします。

@(python.exeの絶対パス) (プ ロ グ ラ ム の 絶 対 パ ス) %*

このバッチファイルを自動実行するようにすればOKです。

API

API(Application Programming Interface)とは、ソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェー

スの仕様である。(Wikipediaより)

難しいですね。簡単に言えば、ソフトウェアの機能の一部を公開して、他のソフトウェアから利用できるようにしたものです。

APIを公開しているサービスはいろいろありますが、ここではTwitterとYouTubeを扱います。

Twitter API

Twitterについて今更説明する必要はないかもしれませんが、TwitterはSNSの一種です。APIを利用すれば、タイムラインや

特定のアカウントのツイートなどを取得することが出来ます。

公式のリファレンスは以下のURLです。

https://developer.twitter.com/

■Twitter APIの認証 Twitter APIは、利用する前に認証を受ける必要があります。

Twitterの認証情報を取得するためには、最初にアプリケーションを登録する必要があります。アプリケーションの管理画面

(https://apps.twitter.com/)ログインし、「Create New App」ボタンをクリックするとアプリケーションの作成画面が表示 されます。データ収集が目的の場合は「Callback URL」に入力する必要はありません。

アプリケーション作成後「Keys and Access Tokens」タブでキーを確認できます。「Create my access token」でアクセストー クンを生成しておきます。

■画像を集める どんなツールがあれば便利かと考えてみた結果、ツイートに含まれる画像だけをダウンロードするものを作るこ とにしました。

好きな俳優やアイドルやイラストレーターが居るとして、その可愛い写真やかっこいい写真が一瞬で手に入ればとっても楽です よね。ということで、特定のアカウントのうち、画像ツイートを検出して、その画像をダウンロードする、というツールを作るこ とにします。

1 #!python3

2 # coding: utf-8

-*-3 fromrequests_oauthlibimport OAuth1Session 4 importos

5 importtime 6 importshelve 7 importrequests 8

9 file=shelve.open(’lasttweet’)

10 lasttweet=file[’lasttweet’]# 最 後 に チ ェ ッ ク し た 日 付 11

12 CONSUMER_KEY=os.environ[’KEY’]

13 CONSUMER_SECRET=os.environ[’SECRET’]

14 ACCESS_TOKEN=os.environ[’ACCESS_TOKEN’]

15 ACCESS_TOKEN_SECRET= os.environ[’ACCESS_TOKEN_SECRET’]

16

17 twitter=OAuth1Session(CONSUMER_KEY,

18 client_secret=CONSUMER_SECRET,

19 resource_owner_key=ACCESS_TOKEN,

第5章 ぱそこんであそぼ 5.5 Webから情報を取得する

21

22 response= twitter.get(’https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=@@@@@&since_id=’ + lasttweet+’&count=300&

exclude_replies=true&include_rts=false’) 23

24 fortweet in response.json():

25 try:

26 for image in tweet[’extended_entities’][’media’]:

27 image_url=image[’media_url’]

28 print(image_url)

29 image =requests.get(image_url) 30 image.raise_for_status()

31 image_file=open(os.path.join(’画像を保存したいフォルダの絶対パス’,os.path.basename(image_url)),’wb’) 32 forchunk in image.iter_content(100000):

33 image_file.write(chunk) 34 image_file.close()

35 time.sleep(5)

36 except:

37 pass

38

39 file.close()

Twitterの認証を得た後、22行目で特定のユーザーのツイートを取得し、24~37行目で、ツイートの中から画像を探してダウン

ロードしています。

• from requests_oauthlib import OAuth1Session

Twitter APIではOAuth認証を用いています。このモジュールはOAuth認証を確認するのに必要なものです。

• shelve

shelveモジュールはプログラム内の変数の値をバイナリ形式で保存しておくためのものです。shelveは、Pythonの辞書型の ように扱うことが出来ます。このプログラムではチェックした最後のツイートのIDを’lasttweet’というキーに保存しています。

openでファイルを開き、closeでファイルを閉じます。

このプログラムを実行する前に、’lasttweet’の値を設定しておく必要があります。

importshelve

file=shelve.open(’lasttweet’) file[’lasttweet’] =’〇〇’

file.close()

このようなプログラムで値を設定できます。

• 認証キー

Twitterのアプリケーション画面で確認したキーを入力するのですが、プログラムに直接書くと、ネット上にアップしてしまう

可能性などが有り危険です。環境変数に登録しておき、os.environで参照するようにすると安全です。

• 22行目

22行目では、条件に合致するツイートをjson形式で入手しています。

表5.1

名前 機能

screen_name ツイートを取得したいユーザー名(@以下の文字列)を指定する

since_id 指定したIDより未来のツイートを取得する

count 指定した数のツイートを取得する

exclude_replies trueを指定すると、リプライを除外する include_rts falseを指定すると、リツイートを除外する

• 24~37行目

ここでは、画像つきツイートを検出し、さらに画像を抜き出して保存するという作業をしています。try~except文は、try以下 のプログラムが実行できる場合は実行し、出来ない場合はexcept以下のプログラムを実行するという構文なので、ツイートに画像 が含まれていればtry以下が実行されます。

第5章 ぱそこんであそぼ 5.5 Webから情報を取得する

取得したツイートは、json形式で以下の画像のようになっています。

これを見ると、ツイートに含まれる画像のURLはextended_entitiesの中の、mediaの中の、media_urlというところに あることがわかります。

29~34行目で画像を保存しています。

raise_for_statusとしておくと、エラーが起こった場合にプログラムを終了させられます。

31=33行目では、画像ファイルを作成し、バイナリ書き込み形式で開き、100000バイトごとに書き込むという作業をしています。

書き込みが終了したらファイルを閉じ、その後、5秒間の待ち時間を設けています。これは、連続でダウンロードするとサーバー に負荷がかかるためです。

ということで、シナモンのアカウントで実際に実行してみます。

かわいい(小並感)。

ドキュメント内 NPCA部誌2018 (ページ 54-62)