今さらPython3 (66) - オートメーション

第9章後半。

入門 Python 3

入門 Python 3

webbrowser

前の記事では、ブラウザとテキストエディタを行ったり来たりして忙しかったけど、久しぶりにPythonから落ち着いて入れるんだね。

>>> import antigravity

f:id:deutschina:20151226144227p:plain

と思いきや、いきなりxkcdというサイトに飛んだw。そんな難しい話ではないし、Pythonのお手軽さアピールなので、一応漫画も最後まで読んだ方が良いかと。

仕切り直し。

>>> import webbrowser
>>> url = 'http://www.python.org/'
>>> webbrowser.open(url)

さっきのは、これと同じ事を裏でやっているんだよね。

>>> webbrowser.open(url)
True
>>> webbrowser.open_new(url)
True
>>> webbrowser.open_new_tab(url)
True

自分のブラウザの設定だと、上の3つは全部同じで新しいタブ作って表示されたけどね。

Web APIとREST

まずは、RESTについて予備知識。みんなの意見は案外正しいらしいので、これを見よう。

REST - Wikipedia

昔、自然言語処理入門(いわゆるNLTK)を少し囓ったときに、Webサイトから情報を拾ってきて、必要ある部分だけ成形して取り出すみたいな話があったけど、scrapyとかBeautifulSoupなんかは、それらの時に出てきた名前だと記憶している。

A quick introduction to web crawling using Scrapy - Part I - Blog - Amaral Lab
Beautiful Soup: We called him Tortoise because he taught us.

BeautifulSoupを使ってのテスト。link.pyをこんな感じで作る。デバッグ用にlink2.pyも作ってみた。

そいでもってlink.pyを実行する。

$ python3 links.py http://boingboing.net
Links in http://boingboing.net
/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "lxml")

  markup_type=markup_type))
1 http://boingboing.net
2 http://boingboing.net/s
3 http://boingboing.net/search
4 javascript:void(0)
5 http://boingboing.net/blog
6 http://bbs.boingboing.net
7 https://bbs.boingboing.net/faq
8 http://store.boingboing.net
...(中略)...
146 http://boingboing.net/about
147 http://boingboing.net/about
>>>

警告が出たけど、同じようなものが出てきましたね。引き続いて、内容を確認するためにlink2.pyを実行してみる。

	for param in sys.argv:	#For debug
		print(param)		#For debug
	for url in sys.argv[1:]:

まずはこの部分で、sys.argvの中身を確認。該当する出力結果はこれ。

links2.py
http://boingboing.net

コマンドからPythonを実行したときのパラメータが返るみたいですね。最初のパラメータがファイル名、2つめが指定したURL。最初はファイル名そのものでいらないから、2つめのパラメータから拾っていると。

	result = requests.get(url)
	page = result.text
	print(result.text)		#for debug

こっちは、result.textに何が入るのよ?という確認がしたかった訳でして。該当する箇所を抜いてみました。

<!doctype html>
<html lang="en-US">

<head>
	
	<title>Boing Boing - A Directory of Mostly Wonderful Things</title>
	
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
...(中略)...
</body>

とんでもなく長い結果が返ってきたけど、該当ページのソースが返るみたいだね。(上のlink2.pyではコメントアウト済)

links = [element.get('href') for element in doc.find_all('a')]

これの内容を理解するために、こんなのを仕込んで確認してみた。

	for elem in doc.find_all('a'):		#for debug
		print(elem)						#for debug

出てきたのがこんな感じ。

<a href="http://boingboing.net"><img src="http://media.boingboing.net/wp-content/themes/bng/i/logo.png"/></a>
<a href="http://boingboing.net/s">SUBMIT</a>
<a href="http://boingboing.net/search">SEARCH</a>
...(以下略)...

BeautifulSoupのfind_all('a')でaタグを全部拾ってくると理解できる。で、get('href')はaタグの中のhref属性値を拾ってくる訳ですね。

最後に、パラメータが複数渡せそうなロジックに見えたので、もう1つURLを追加して実行してみた。

$ python3 links.py http://boingboing.net http://www.google.co.jp

2つ目に追加したgoogle.co.jpのリンクも出てますね。

...(略)...
Links in http://www.google.co.jp
1 http://www.google.co.jp/imghp?hl=ja&tab=wi
2 http://maps.google.co.jp/maps?hl=ja&tab=wl
3 https://play.google.com/?hl=ja&tab=w8
4 http://www.youtube.com/?gl=JP&tab=w1
5 http://news.google.co.jp/nwshp?hl=ja&tab=wn
6 https://mail.google.com/mail/?tab=wm
7 https://drive.google.com/?tab=wo
8 https://www.google.co.jp/intl/ja/options/
9 http://www.google.co.jp/history/optout?hl=ja
10 /preferences?hl=ja
11 https://accounts.google.com/ServiceLogin?hl=ja&passive=true&continue=http://www.google.co.jp/
12 /chrome/browser/?hl=ja&brand=CHNG&utm_source=ja-hpp&utm_medium=hpp&utm_campaign=ja
13 /advanced_search?hl=ja&authuser=0
14 /language_tools?hl=ja&authuser=0
15 https://www.google.com/url?q=https://play.google.com/store/apps/collection/promotion_3001d1a_google_apps&source=hpp&id=5083210&ct=8&usg=AFQjCNH2g_4hADNfzHkowt7_z-UAPxs6cg
16 https://www.google.com/url?q=https://itunes.apple.com/jp/developer/google-inc./id281956209&source=hpp&id=5083210&ct=8&usg=AFQjCNFsR-Lvz1shR8ts1KuGhIAv1l6y4A
17 /intl/ja/ads/
18 http://www.google.co.jp/intl/ja/services/
19 https://plus.google.com/115899767381375908215
20 /intl/ja/about.html
21 http://www.google.co.jp/setprefdomain?prefdom=US&sig=__VQlYkT5NCxbTYdAvmHscUxJJU5U%3D
22 /intl/ja/policies/privacy/
23 /intl/ja/policies/terms/

これで第9章は終了。

(つづく)