検索結果を完全自動取得?Pythonでキーワードを指定して、検索結果をスクレイピングしてみよう!
今回のチュートリアルの学習内容
このチュートリアルでは、以下の操作を自動化します。
まず、このサイトでPythonやスクレイピングなどのキーワードに該当する記事がいくつあるか調べたいとします。
普通にこれをまとめるとすると、まず最初に、一つずつ検索していきます。
そうすると、その検索結果で、キーワードと該当する記事数が出てきます。
これを、目視でスプレッドシートなどに保存していきます。
keyword | count |
Python | 5 |
API | 12 |
スクレイピング | 14 |
実際に、僕自身もこういう作業を転職サイトの求人数などを調べるために利用したことはありますが、すごく大変ですよね。
これを、スクレイピングによって全自動でリサーチしていきたいと思います。
このチュートリアルを学習する前に必要な学習項目
このチュートリアルでは、スクレイピングの基礎を理解していることが前提となりますので、以下のチュートリアルを学習しておいてください。
どうやって検索結果を取得するの?
実際に、まずはこちらのブログでPythonと検索してみてください。
そして、検索結果のURLを見てみてください。
https://code.dividable.net/?s=Python
以下のように表示されていると思います。
特徴的なのは、/以降の、?s=Python
という文字列でしょう。
これは、URLパラメーターといって、URLの後ろにつけるものです。
難しそうですが、とてもシンプルです。
まず、?は、「これからURLパラメーターが入力されますよ」という合図です。
そして、イコールでセットになっているのが、実際に送信されるパラメーターです。
s = Python
となっています。sはsearch keywordの略だと思われますが、要は
「検索キーワードはPythonです」と伝えています。
ということで、これから特定のキーワードで検索キーワードを取得したい場合は、
S=[任意の検索キーワード]
という風に検索してあげればよいわけですね。
それでは、実際にスクレイピングしてみましょう。
ライブラリのインポート
まずは、スクレイピングをしてCSV出力するために必要なライブラリをインポートしましょう。
TODO
- Requests, Pandas, BeautifulSoupをインポートしてください。
結果
#TODO ライブラリをインストールする
import requests
import pandas as pd
from bs4 import BeautifulSoup
キーワードを設定して検索する
最終的には、複数キーワードで自動取得しますが、理解しやすいためにまずは一つのキーワードで試していきたいと思います。
TODO
- 検索キーワードを指定してください。
- 検索キーワードで検索してみてください
- 検索結果を、BeautifulSoupにパースして、soup.prettifyメソッドでHTMLを可視化してみてください
答え
import requests
import pandas as pd
from bs4 import BeautifulSoup
#TODO 検索キーワードで検索してみてください
keyword = "Python"
#TODO キーワードを検索してみてください
res = requests.get("https://code.dividable.net/?s=" + keyword).text
#TODO BeautifulSoupにパースして、soup.prettifyメソッドでHTMLを可視化してみてください
soup = BeautifulSoup(res, 'html.parser')
soup.prettify
出力結果(一部抜粋)
<div class="container">
<nav class="navbar navbar-expand-md">
<a href="/" id="#brand__name">
<img height="24px" src="https://dividable.net/wp/wp-content/uploads/2020/04/dainote_logo.png"/>
</a>
<button class="navbar-toggler" data-target="#navbarCollapse" data-toggle="collapse" type="button">
<span class="navbar-toggler-icon"></span>
</button>
<nav class="collapse navbar-collapse " id="navbarCollapse">
<div class="navbar-nav ml-auto">
<a class="nav-item nav-link active" href="/courses">学習ルート一覧</a>
<a class="nav-item nav-link active" href="/tutorials">チュートリアル一覧</a>
</div>
</nav>
<form action="https://code.dividable.net/" class="search-form form-inline my-2 my-lg-0" method="get" role="search">
<label>
<input class="search-field form-control mr-sm-2" name="s" placeholder="キーワードを入力..." title="検索:" type="search" value="Python"/>
</label>
<input class="search-submit" type="submit" value="検索"/>
</form>
</nav>
</div>
</header>
<main id="index" itemprop="mainContentOfPage" itemscope="itemscope" itemtype="http://schema.org/Blog">
<div class="container main">
<div class="container">
<div class="row">
<h2>「Python」の検索結果: <span id="search__count">16</span>件</h2>
<div class="wrap">
<!-- カテゴリページの場合-->
検索結果から、該当記事数を取得する
それでは、次に該当記事数を取得します。
該当記事数が分かるのは、こちらのHTMLを読めばよいはずです。
それでは、該当するコードを読み込んでいきましょう。
さきほどBeautifulSoupで出力した該当するHTMLを確認します。
<div class="row">
<h2>「Python」の検索結果: <span id="search__count">16</span>件</h2>
<div class="wrap">
ここの値をとればいいわけですね。
早速、ここの件数の部分を取得してみましょう。
TODO:
- 取得した件数部分のCSS Selectorを指定してください
- 件数を取得してください
- 件数をPrintしてください
結果
import requests
import pandas as pd
from bs4 import BeautifulSoup
keyword = "Python"
res = requests.get("https://code.dividable.net/?s=" + keyword).text
soup = BeautifulSoup(res, 'html.parser')
#TODO 取得した件数部分のCSS Selectorを指定してください
tag = "#search__count"
count = soup.select(tag)[0].string
print (count)
出力結果
16
これで、件数を取得することができました。
CSVに保存する
ここからは、以前のチュートリアルの通りなので、解説は少なめにします。
TODO:
- pandasで、列名がkeyword, countであるデータフレームを作成してください
- pandasで、取得したkeywordとcountを代入するSeriesを作成してください
- pandasで、DataFrameにSeriesを追加してください
- データフレームの先頭行を、headメソッドを利用して確認してください
答え:
import requests
import pandas as pd
from bs4 import BeautifulSoup
keyword = "Python"
res = requests.get("https://code.dividable.net/?s=" + keyword).text
soup = BeautifulSoup(res, 'html.parser')
tag = "#search__count"
count = soup.select(tag)[0].string
#TODO pandasで、列名がkeyword, countであるデータフレームを作成してください
columns = ["keyword", "count"]
df = pd.DataFrame(columns=columns)
#TODO pandasで、取得したkeywordとcountを代入するSeriesを作成してください
se = pd.Series([keyword, count], columns)
#TODO pandasで、DataFrameにSeriesを追加してください
df = df.append(se, ignore_index=True)
df.head()
出力結果:
keyword | count | |
---|---|---|
Python | 16 |
上記のように出力されていたら成功です。
複数キーワードを指定して、取得する
さて、次はPythonだけではなくて、複数のキーワードを指定して検索してみましょう。
TODO
- Python, スクレイピング, API というキーワードで検索するために、リストを定義してください
- 今までのコードを、For文を利用して、キーワードごとに検索できるように書き換えてください
- データフレームの先頭行を取得してください
import requests
import pandas as pd
from bs4 import BeautifulSoup
# Python, スクレイピング, API というキーワードで検索するために、リストを定義してください
keywords = ["Python", "スクレイピング", "API"]
columns = ["keyword", "count"]
df = pd.DataFrame(columns=columns)
#今までのコードを、For文を利用して、キーワードごとに検索できるように書き換えてください
for keyword in keywords:
res = requests.get("https://code.dividable.net/?s=" + keyword).text
soup = BeautifulSoup(res, 'html.parser')
tag = "#search__count"
count = soup.select(tag)[0].string
#TODO 列名にkeywordとcountが入ったデータフレームを用意する
se = pd.Series([keyword, count], columns)
df = df.append(se, ignore_index=True)
#TODO データフレームの先頭行を取得してください
df.head()
答え
keyword | count | |
---|---|---|
0 | Python | 16 |
1 | スクレイピング | 7 |
2 | API | 16 |
CSVにダウンロードする
それでは、最後にCSVに保存してみましょう。
TODO
- CSVに保存するコードを書いてください。
答え
import requests
import pandas as pd
from bs4 import BeautifulSoup
keywords = ["Python", "スクレイピング", "API"]
columns = ["keyword", "count"]
df = pd.DataFrame(columns=columns)
for keyword in keywords:
res = requests.get("https://code.dividable.net/?s=" + keyword).text
soup = BeautifulSoup(res, 'html.parser')
tag = "#search__count"
count = soup.select(tag)[0].string
#TODO 列名にkeywordとcountが入ったデータフレームを用意する
se = pd.Series([keyword, count], columns)
df = df.append(se, ignore_index=True)
df.head()
#TODO CSVに保存してみてください。
filename = "result.csv"
df.to_csv(filename) #encoding指定しないと、エラーが起こります。おまじないだともって入力します。
from google.colab import files
files.download(filename)
実行すると、出力結果を保存することができます。
最後に
どうでしたか?
今回のチュートリアルでは、検索結果を保存する方法について学びました。
もしできた方は、#DAINOTE のハッシュタグをつけて、ぜひ投稿してみてくださいね!