PythonによるWebスクレイピング②Google検索の結果から、アフィリエイトコードが入っている記事を抜き出す -
〇目次
・最終成果物の確認
・どんなことをするチュートリアル?
・ライブラリのインポート
・CSVの型を作成(DataFrameの作成)
・キーワードの検索結果を取得する
・あるURLに存在するアフィリエイトコードをすべて抽出する
・すべての機能を関数にして実装
より実践的なスクレイピングについて学んでいきます。今回はより実践的に、「ビジネス課題解決のためのプログラミング」を行っていきたいと思います。
前回の「Pythonによるスクレイピング超絶入門」では、ブログ記事からURLを取り出すだけの、非常に簡単なスクレイピングを学びました。
最終成果物
今回は、もう少しレベルアップして、Google検索の結果から、記事を一覧取得してそれぞれのURLにアクセスし、中のデータを取得してCSVに保存するということをやってみたいと思います。また、今回もGoogle Colaboratoryを利用するので、Pythonの環境構築は一切不要です。
できあがるものはこんな感じです。
〇どんなことをするチュートリアル?
・Google検索の結果から、上位10記事を抜き出して、それぞれのページから特定の文字列(今回はアフィリエイトコードが入ったURL)を抜き出すチュートリアル
です。
Google検索して、出てきたすべてのページにアクセスし、そこからアフィリエイトコードがあればCSVに出力するというようなスクレイピングを学びます。
〇誰が対象?
・アフィリエイター
・Webの広告主、もしくはASPの担当者
・Webマーケター
・その他スクレイピングを学んでみたい人
〇どのような課題、ニーズを解決できる?
・アフィリエイター:「アフィリエイトをやろうと思ったけど、キーワードでどういう広告主がいるのかわからないから、手動で検索しているけど面倒くさい。」
・広告主:「製品をよりプロモーションしたい。似たような製品があって、他社の製品をアフィリエイトを書いている人にコンタクトをとりたい。キーワードで他社の商品を紹介している人」
・Webマーケター:「ある商品がよく売れているかどうかを判断するキーワード特定のために、アフィリエイトコードが含まれているか確認したい」
〇どう課題を解く?
・あるキーワードで検索したときの上位10件から、アフィリエイトコードが含まれたURLを全部抽出し、CSVにエクスポートする
〇事前に学ぶこと
・ProgateでPythonの基礎を学習済み (※必須)
・Pythonによるスクレイピング入門でスクレイピングの基礎を学んでいただけるとよいと思います。(※必須)
・AidemyでPandasを学習 (※ できたら)
このチュートリアルは、『Pythonによるスクレイピング入門でスクレイピングの基礎』で学習済みの内容が入ってくるので、まだ学習していない方はこちらを理解したうえで、学習を進めることをお勧めします。
〇本チュートリアルの範囲
・Google上で検索したキーワードで、上位10件の記事名とURLを取得
・それぞれのURLにアクセスし、アフィリエイトコード入りのURLを全部取得
・それぞれのURLのタイトルを取得する
・CSVにエクスポートする
〇ライブラリのインポート
まずはスクレイピングとCSVにデータを抽出する際に必要なライブラリをインストールします。ここがわからない場合は、「Pythonによるスクレイピング超絶入門」を読んでみてください。
#ライブラリインストール
from bs4 import BeautifulSoup
import requests
import pandas as pd
from google.colab import files
〇CSVの型を作成(DataFrameの作成)
検索順位(rank), 記事名(title)、記事のURL(url), アフィリエイトコードのurl(affiliate_url)を最終的に含んだ記事をアウトプットしたいので、以下のようなデータフレームを作成します。
columns = ['rank','title','url', 'affiliate_url']
df = pd.DataFrame(columns=columns)
df.head()
〇キーワードの検索結果を取得する
それでは、Google検索してみましょう。よくあるアフィリエイトのキーワードで、「会社 行きたくない」というキーワードがあります。これの検索結果を取得してみましょう。
まずは、keywordという変数に「会社 行きたくない」と指定します。
keyword = '会社 行きたくない'
URLを検索した結果を、BeautifulSoup上で取得して、HTMLを出力します。
html_doc = requests.get('https://www.google.co.jp/search?num=10&q=' +keyword).text
soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化
print(soup.prettify())
記事名が含まれた部分のHTMLを見てみましょう。
<ol>
<div class="g">
<h3 class="r">
<a href="/url?q=http://career-theory.net/dont-want-to-go-to-work-5628&sa=U&ved=0ahUKEwiNk9LHldfdAhUowFkKHe1JDc4QFggUMAA&usg=AOvVaw2bQgJNPO5k35th4cb-eW8A">
<b>
会社
</b>
に
<b>
行きたくない
</b>
5つの原因を対処・解決するための全知識
</a>
</h3>
記事タイトルのHTMLタグは、<h3 class="r"> のものなので、これを取得します。
tags = soup.find_all('h3',{'class':'r'})
print (tags)
HTMLタグすべてが取得されてしまったので、urlのみを取得します。
tag.select("a") をすると、自動でリスト形式で帰ってきてしまいます。そこで、[0]を指定することで、リストから抜き出した形に取得します。
for tag in tags:
print (tag.select("a")[0].get("href"))
/url?q=がいらないので、削除します。
特定の文字列を削除するときは、replaceメソッドが便利です。
for tag in tags:
print (tag.select("a")[0].get("href").replace("/url?q=",""))
この状態で上記のURLをクリックしても、うまくいきません。原因は、&のパラメーターが悪さをしているからです。なので、&以降のデータを削除したいと思います。
〇コラム
僕はこのチュートリアル作成時点では、この削除方法を知らなかったので、[python remove parameter]で検索した際に、このStack Over Flowという質問サイトに飛びました。最初日本語で検索しても出てこなかったので、困った時には英語で検索するとよいです。
なので、&以降のデータを削除できる関数を用意しました。
def query_string_remove(url):
return url[:url.find('&')]
この引数にURLを入れると、&以降が削除された形でURLを取得することができます。
それでは、さきほどのURLを取得する際に、いま作った関数を利用してみましょう。
for tag in tags:
print (query_string_remove(tag.select("a")[0].get("href").replace("/url?q=","")))
うまくできましたね。
以下の処理を、一つの関数にまとめましょう。
〇get_search_results_df(keyword)関数
* 検索キーワードを入れると、その検索キーワードでGoogle検索
* 上記10件の記事名とURLを取得
* URLはアクセスできるように処理した状態で出力される
from bs4 import BeautifulSoup
import requests
import pandas as pd
from google.colab import files
def get_search_results_df(keyword):
columns = ['rank','title','url', 'affiliate_url']
df = pd.DataFrame(columns=columns)
html_doc = requests.get('https://www.google.co.jp/search?num=10&q=' +keyword).text
soup = BeautifulSoup(html_doc, 'html.parser') # BeautifulSoupの初期化
tags = soup.find_all('h3',{'class':'r'})
rank = 1
for tag in tags:
title = tag.text
url = query_string_remove(tag.select("a")[0].get("href").replace("/url?q=",""))
affiliate_url = ""
se = pd.Series([rank, title, url, affiliate_url], columns)
df = df.append(se, ignore_index=True)
rank += 1
return df
def query_string_remove(url):
return url[:url.find('&')]
これらの関数を使って、「仕事 行きたくない」で検索してみましょう。うまくいくと、下の画像のように取得できるかと思います。
keyword = "仕事 行きたくない"
search_results_df = get_search_results_df(keyword)
search_results_df.head(10)
あるURLに存在するアフィリエイトコードをすべて抽出する
今度は、検索結果にあるアフィリエイトコードを全抽出します。 今回は、「会社 行きたくない」というキーワードで検索した中で、アフィリエイトコードがあるかどうかを先に確認してみましょう。
サポートでいただいたお金はFanzaの動画を購入するために利用されます。