(79) なんちゃってGoogle検索

投稿者: | 2016年11月10日

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) &lt;= 0:
			title = '***'
		if re.match('http', site):
			href = site
		else:
			href = 'https://www.google.com' + site
		print '&lt;a href=\"%s\"&gt;%s&lt;/a&gt;&lt;hr /&gt;' % (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

カテゴリー: WEB

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です