よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

Google検索のURLリスト化プログラム

Google検索で検索結果のURLリストを生成するプログラム。完全丸パクり。m(__)m
動くかどうか試させていただきました。

実行環境

Androidスマホ
termux
Python3.7

写経元は
【Python】Googleの検索結果をアクセス制限なしで取得する



urllibrequestsbeautifulsoup4モジュールをインストールして動かす。

pip install urllib requests beautifulsoup4


urllib で検索するとインストールできないというページが上位に表示された。その場合はcryptoを先にインストールする等で対処できるらしいけど詳しい事は分からない。

import json
from urllib import parse
import requests
from bs4 import BeautifulSoup


class Google:
    def __init__(self):
        self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
        self.session = requests.session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

    def Search(self, keyword, type='text', maximum=100):
        '''Google検索'''
        print('Google', type.capitalize(), 'Search :', keyword)
        result, total = [], 0
        query = self.query_gen(keyword, type)
        while True:
            # 検索
            html = self.session.get(next(query)).text
            links = self.get_links(html, type)

            # 検索結果の追加
            if not len(links):
                print('-> No more links')
                break
            elif len(links) > maximum - total:
                result += links[:maximum - total]
                break
            else:
                result += links
                total += len(links)

        print('-> Finally got', str(len(result)), 'links')
        return result

    def query_gen(self, keyword, type):
        '''検索クエリジェネレータ'''
        page = 0
        while True:
            if type == 'text':
                params = parse.urlencode({
                    'q': keyword,
                    'num': '100',
                    'filter': '0',
                    'start': str(page * 100)})
            elif type == 'image':
                params = parse.urlencode({
                    'q': keyword,
                    'tbm': 'isch',
                    'filter': '0',
                    'ijn': str(page)})

            yield self.GOOGLE_SEARCH_URL + '?' + params
            page += 1

    def get_links(self, html, type):
        '''リンク取得'''
        soup = BeautifulSoup(html, 'lxml')
        if type == 'text':
            elements = soup.select('.rc > .r > a')
            links = [e['href'] for e in elements]
        elif type == 'image':
            elements = soup.select('.rg_meta.notranslate')
            jsons = [json.loads(e.get_text()) for e in elements]
            links = [js['ou'] for js in jsons]
        return links



実行


写経元コメント

ドラえもん」の検索結果が200件ほしいなら、こんな感じで使います。resultにはurlのリストが渡ります。


検索内容を個人的関心事に書き換えた。

google = Google()

# テキスト検索
result = google.Search('JavaScriptの変数をPythonに渡す方法', type='text', maximum=200)

# 画像検索
result = google.Search('ドラえもん', type='image', maximum=200)
print(result)

これをtermuxで実行中にlxmlモジュールがないぞと言われました。
素直にインストールできない場合はこちらを参考に。
【termux】lxmlモジュールのインストール方法覚え書き - よちよちpython