PythonのBeautifulSoupでGoogle検索スクレイピング

この記事ではBeautifulSoupの使い方を説明するとともに、実践としてPythonでGoogle検索順位をスクレイピングするまでのやり方を紹介していく。

スクレイピングとは英語でscrapingとも書くように「こすること」「削ること」の意味である。つまり、サイトのHTMLやXMLからデータを抽出することをWebスクレイピングと読んでいる。

Pythonでスクレイピングする大まかな手順は次の通り。

  1. urllibでHTMLを丸ごとダウンロード
  2. BeautifulsoupでHTMLをオブジェクト化
  3. Beautifulsoupで目的のタグ内のテキストなどを抽出

この記事ではBeautifulSoupの使い方を説明するとともに、最終的にPythonでGoogle検索順位をスクレイピングするまでのやり方を紹介していく。Beautifulsoupを使えばグッとスクレイピングの手間とハードルを下げることができる。スクレイピングと聞くだけでアレルギー反応を起こしていた方も、Beautifulsoupを知ってしまえばその常識を覆されることだろう。

それではさっそく、スクレイピングの世界へ足を運んでいこう。(本記事のプログラムはPython3で動作するものとする。)

BeautifulSoupのインストール

まずはBeautifulSoupをpipでインストール。BeautifulSoup最新版がbeautifulsoup4なので次のようにしてインストールしておく。

$ pip3 install beautifulsoup4

サイトタイトルを抽出(スクレイピング)してみよう

細かい説明は抜きにして大雑把なイメージをつかむためにも、適当にサイトのtitleタグをスクレイピングしてみよう。次のようにとても簡潔なプログラムでサイトのタイトルを抽出できる。

import urllib.request
from bs4 import BeautifulSoup


url = "https://101010.fun/posts/world-ios-android-share-2020.html"
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as res:
    html = res.read()
    soup = BeautifulSoup(html, 'html.parser')
    title = soup.find('title').get_text()
    print(title)

BeautifulSoupの使い方

さきほどのプログラムがあまりに簡単だったので拍子抜けしたかもしれない。もう少し詳しくBeautifulSoupの使い方を説明してみよう。

HTMLをオブジェクト化

HTMLテキストを soup = BeautifulSoup(html, 'html.parser') でオブジェクト化する。

特定のタグを見つける

たとえばaタグを見つけたい場合は、オブジェクト化した soup を使って soup.find_all('a') のようにして検索することができる。そしてaタグが見つかれば、その結果が配列で返ってくる。

たとえばaタグの子要素にh3タグが入っている場合、スクレイピングは次の感じで行う。

for a_tag in soup.find_all('a'):
    h3_tag = a_tag.select("h3")

    if len(h3_tag) > 0:
        ...

Googleのキーワード検索結果をスクレイピング

それではBeautifulSoupを使った実践的な例として、Googleの検索画面をスクレイピングしてみたので紹介する。次の手順でプログラムを組んで、特定のキーワードでの検索順位を取得する。

  1. urllibで検索結果のHTMLを取得
  2. BeautifulSoupでHTMLをオブジェクト化
  3. 特定のURLが結果に含まれているかチェック
  4. 含まれていなければ最大5ページまで繰り返し探す

以上の手順で書いたプログラムがこちら。

Google検索順位をスクレイピングするPythonプログラム

# Created by Toshihiko Arai.
# https://101010.fun/programming/python-beautifulsoup-googlerank.html

import urllib.request
from urllib.parse import quote
from bs4 import BeautifulSoup
import time

keyword = 'ios android シェア'
target = 'https://101010.fun/posts/world-ios-android-share-part1.html'
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"

def get_search_html(keyword, page):
    start = "&start=" + str(page * 10) # 次ページstart=10
    url = 'https://www.google.com/search?q=' + quote(keyword) + start 
    
    headers = {'User-Agent': user_agent}
    req = urllib.request.Request(url, headers=headers)

    with urllib.request.urlopen(req) as res:
        body = res.read()
        return body


def get_page_rank(soup, page):
    res_rank = 1

    for a_tag in soup.find_all('a'):
        h3_tag = a_tag.select("h3")

        if len(h3_tag) > 0:
            if a_tag.get('href').startswith(target) == True:
                # print(h3_tag[0].get_text())
                # print(a_tag.get('href'))
                return res_rank + page * 10

            res_rank += 1
    return -1

rank = -1
max_page = 5

for page in range(max_page):
    html = get_search_html(keyword, page)
    soup = BeautifulSoup(html, 'html.parser')

    title_text = soup.find('title').get_text()
    print(title_text)
    rank = get_page_rank(soup, page)

    page += 1
    if rank != -1:
        break

    time.sleep(3) # アクセス制限対策
    
if rank != -1:
    print("順位: {}位".format(rank))
else:
    print("見つかりませんでした")

上記のプログラムをPython3で実行すると、検索順位が標準出力されるようになっている。

ios android シェア - Google 検索
順位: 2位

このプログラムをさらに改造して、検索したいキーワードをテキストファイルで管理し複数検索できるようにしたり、実行結果をエクセルで管理できるようにすればランキングツールを作ることができるだろう。

ExcelをPythonから操作する記事はこちら

Pythonスクレイピングのオススメ書籍

Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!
Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!

機械学習やデータ分析になくてはならない「データ」。このようなデータは、インターネット上に膨大にありますが、Pythonを使えば効率よくデータ収集できます。こうした手法を「スクレイピング」といいます。

KindleAmazonRakuten
スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活
スクレイピング・ハッキング・ラボ Pythonで自動化する未来型生活

本書ではPythonを使ったWebスクレイピングテクニックについて解説します。いろいろなことをPythonで自動化していきましょう。日本の主要なサービスを題材に、スクレイピングでデータを取得する方法と、そのデータを元に分析や可視化していく手法を紹介していきます。

KindleAmazon

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/