2,840 views
この記事は最終更新から 1977日 が経過しています。
Google検索&結果表示をPython経由で行う。
ウェブスクレイピングの基礎になるのかも(?)
実行サンプルはこちら。
https://www.dogrow.net/python/sample/0078/
(1/2) index.cgi
1ページ目しか表示できていない…
内部で start=10,20,30 などと切り替えて情報収集を繰り返せば複数ページ分を表示できるけど、まずは基本形のみを作ってみる。
#!/usr/local/bin/python # -*- coding: utf-8 -*- print 'Content-type: text/html' import cgi import myparser import re print """ <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>サンプル</title> </head> <body> """ form = cgi.FieldStorage() if form.has_key('word'): word = re.sub("[ | ]+","+",form['word'].value) url = 'https://www.google.co.jp/search?q=' + word linkItem = myparser.parse(url) for item in linkItem: title = item.get_title() site = item.get_ref() if len(title) <= 0: title = '***' if re.match('http', site): href = site else: href = 'https://www.google.com' + site print '<a href=\"%s\">%s</a><hr />' % (href, title) print """ <form enctype="multipart/form-data" action="./" method=post> Google検索:<input type=text name=word style="width:400px"> <input type=submit value="実行"> </form> </body> </html> """
(2/2) myparser.py
強引なところもあるので、後で勉強し直して修正するかも…
指定WEBページのデータ取得には urllib2 モジュールのHTTPラッパー機能を使用する。
HTMLの構文解析には HTMLParser モジュールを使用する。(今回は楽できる lxml を使わない)
Pythonプログラムで文字列を処理する間は unicode で扱う。
#!~/usr/local/bin/python # -*- coding: utf-8 -*- import chardet import urllib2 from HTMLParser import HTMLParser class MyLinkItem: def __init__(self): self.m_ref = '' self.m_title = '' def set_ref(self, val): self.m_ref = val def set_title(self, val): self.m_title = val def get_ref(self): return self.m_ref.encode('utf-8') def get_title(self): return self.m_title.encode('utf-8') class MyParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.m_linkItem = [] self.proc_atag = False self.title = '' def handle_starttag(self, tagname, attribute): if tagname.lower() == 'a': for i in attribute: if i[0].lower() == 'href': if re.match('\/url\?q=http', i[1]): if not re.search('webcache\.googleusercontent', i[1]): self.proc_atag = True self.title = '' linkItem = MyLinkItem() linkItem.set_ref(i[1]) self.m_linkItem.append(linkItem) def handle_endtag(self, tagname): if tagname.lower() == 'a': if self.proc_atag == True: self.m_linkItem[-1].set_title(self.title) self.proc_atag = False def handle_data(self, data): if self.proc_atag == True: self.title = self.title + data def get_linkItem(self): return self.m_linkItem def parse(url): # load html opener = urllib2.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] html = opener.open(url) data = html.read() html.close() rr = chardet.detect(data) # 文字コードを判定 data = data.decode(rr['encoding']) # unicodeに変換 # parse parser = MyParser() parser.feed(data) linkItem = parser.get_linkItem() parser.close() return linkItem