3,486 views
この記事は最終更新から 2373日 が経過しています。
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
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-04-19: 0回 2026-04-18: 0回 2026-04-17: 0回 2026-04-16: 0回 2026-04-15: 0回 2026-04-14: 0回 2026-04-13: 0回