PythonのBeautifulSoupでGoogle検索スクレイピング
この記事ではBeautifulSoupの使い方を説明するとともに、実践としてPythonでGoogle検索順位をスクレイピングするまでのやり方を紹介していく。
スクレイピングとは英語でscrapingとも書くように「こすること」「削ること」の意味である。つまり、サイトのHTMLやXMLからデータを抽出することをWebスクレイピングと読んでいる。
Pythonでスクレイピングする大まかな手順は次の通り。
- urllibでHTMLを丸ごとダウンロード
- BeautifulsoupでHTMLをオブジェクト化
- 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の検索画面をスクレイピングしてみたので紹介する。次の手順でプログラムを組んで、特定のキーワードでの検索順位を取得する。
- urllibで検索結果のHTMLを取得
- BeautifulSoupでHTMLをオブジェクト化
- 特定のURLが結果に含まれているかチェック
- 含まれていなければ最大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スクレイピングのオススメ書籍
最後まで読んでいただきありがとうございました。
「この記事が参考になったよ」という方は、ぜひ記事をシェアをしていただけるととても嬉しいです。
今後も有益な記事を書くモチベーションにつながりますので、どうかよろしくお願いいたします。↓↓↓↓↓↓↓