スクレイピング超入門 #2

今回は実際のWebサイトの情報をスクレイピングする方法を学習していきます

スクレイピング超入門 #2では、

  • Requestsを使ったWebサイトのダウンロード
  • BeautifulSoupを使ったWebサイトの解析
  • ブログの記事名とURLをスクレイピング

を説明していきます。

使用するWebサイトはこのブログ、ナギ倶楽部を使います。

先に前回記事「スクレイピング超入門 #1」を読んでからこの記事を読んでください。

はじめに

こんにちはTakagiです!

前回記事「スクレイピング超入門 #1」ではスクレイピングの説明と

BeautifulSoupを使ってのスクレイピングを実践しました。

改めて、このシリーズで完成させる目的物は

レコチョク,オリコンランキングの月間、週間ランキングをそれぞれ自動で抽出してきて表示するWebサイト

です。

このWebサイトを使って流行りの波に乗りましょう!!

また、制作を通して

好きなWebサイトから欲しい情報をスクレイピングできるようになります。

自動で収集したい情報とかを見つけておくといいかもしれませんね!

さて、

スクレイピング超入門 #2 では、

実際にWebサイトから情報を抽出してきて記事名とURLをスクレイピングする方法を説明します!

この方法で他のWebサイトも同じ方法でスクレイピングすることが出来ます!

自分でも他のWebサイトで挑戦してみてください!

それでは

「スクレイピング超入門 #2」スタートです!!


検証ツール

Webサイトをスクレイピングするために、”検証ツール”はとても役に立ちます。

Progateでわかりやすく解説されているので、是非読んでみてください!

Requests

RequestsはPythonのライブラリの一つでWebサイトからデータをDL(ダウンロード)してくれます。

インターネットからWebデータをDLすることで、自分のまな板(PC)にWebデータを乗せることが出来ます。

後は煮るなり焼くなりご自由に!っていう感じです(わかりにくい)

使い方はとても簡単です!

まずはライブラリを取り込みます。

import requests #Requestsライブラリをインストール

次にデータを取得します。適当に変数の中に入れておきましょう。

r = requests.get("https://naggi.club").content #ナギ倶楽部のデータをダウンロード

 

補足) contentを必ず付ける理由

BeautifulSoupで解析するためです!

BeautifulSoupはHTMLの文字列を解析してくれます。

Webサイトの「HTMLの文字列」を取得するためにcontentを必ず付けます。

用語解説

Request(リクエスト)

ユーザー(ブラウザ)からWebサーバーにデータを要求すること。

クレープ屋でクレープを”注文”するイメージ

Response(レスポンス)

Webサーバーからデータ(主にHTMLファイル)をユーザー(ブラウザ)に渡すこと。

クレープ屋が客にクレープを渡すイメージ

WEBサイトの仕組みの基本となる用語なのでしっかりと覚えておきましょう。

 

それでは、取得したデータはBeautiful Soupで解析しましょう!

BeautifulSoupを使ったブログの解析

Webサイトを対象としたスクレイピングとはいえ、やることは前回とそんなに変わりません。

まず、ライブラリをインストールします。

from bs4 import BeautifulSoup #BeautifulSoupライブラリをインストール

次の文法に従ってWebサイトのHTMLを解析しましょう。

BeatifulSoup(解析したいHTML,"html.parser")
soup = BeautifulSoup(r,"html.parser") #取得したWebサイトを解析する

これでWebサイトのBeautifulSoupオブジェクトが得られました。

一度表示してみましょう

print(soup)

あばばばばばばばばばばばば

出力がすごくカオスになったことと思います。せめてインデントつけて見やすくしたいですね!

そういうときは、prettify()のメソッドを使うとインデントされた状態で出力することが出来ます。

print(soup.prettify()))

それではこのBeautifuSoupオブジェクトを使ってナギ倶楽部の記事名とURLをスクレイピングしてみましょう!

さっそく検証ツールも使います!

ブログの記事名とURLをスクレイピング

まず、ナギ倶楽部(https://naggi.club/)で検証ツール使います。

今回は「Webサイトの記事名とURLをスクレイピングしてくる」ことが目標です。

なので

検証ツールを起動して、図のように記事名にカーソルを合わせると

h2タグのclass:entry-titleに記事名とURLがあることが分かりました。

<h2 class="entry-title"><a href="https://naggi.club/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0/%e3%82%b9%e3%82%af%e3%83%ac%e3%82%a4%e3%83%94%e3%83%b3%e3%82%b0%e8%b6%85%e5%85%a5%e9%96%80%e3%80%801/" rel="bookmark">スクレイピング超入門 #1</a></h2>

find_all()メソッドを使って、他の記事情報も取得しましょう!

記事名とURLを取得するコードが次のようになります。

tags = soup.find_all("h2",{"class":"entry-title"})

補足) find_allメソッドでのclass指定

find_allメソッドはHTML要素をクラス指定をする際にPythonの辞書データの形で指定します。

第1引数は「h2」なので要素のタグの名前

第2引数は「{“class”: “entry-title”}」となっていますので、辞書データの形でオプションをしています

 

。。。わかりにくくない??

今回は要素の指定にCSSセレクタというものを使ってみます。

CSSセレクタ

???HTMLを解析するのにCSSセレクタを使えるのか??と思われたかもしれません。

実はCSSセレクタを使ってHTMLの要素を抽出してくることができるんです!!

このブログでは簡単に紹介するので、詳しく知りたい方はWeblikerさんのCSSセレクタの記事がわかりやすかったので紹介させていただきます!

[.クラス名] ([]は記入しない)
# HTMLのクラス名を使って要素を指定

[#id名] ([]は記入しない)
# HTMLのid名を使って要素を指定

検証ツールから、今回欲しい情報が入っているのはclassが「entry-title」ということが分かります。

CSSセレクタを使ってスクレイピングしてくるときは

.select("CSSセレクタ")

という文法で書けます。

今回はクラス名を指定します。CSSセレクタは.entry-titleです。

tags = soup.select(".entry-title")

こっちの方が簡単に書けますね!!

記事のタグを取得するコードは最終的にこんな感じになりました。

#find_all()メソッドを使う
tags = soup.find_all("h2",{"class":"entry-title"}) #わかりにくいので使わない

#CSSセレクタを使う
tags = soup.select(".entry-title") #簡単で見やすい

 

これらをfor文を使って表示するタグ一覧を表示することが出来ます。

#タグを指定して記事名とURLを獲得する。
tags = soup.select(".entry-title")

#for文を使って記事のタグを表示する。 
for tag in tags: 
    print(tag)

 

このような結果の中から、記事名とURLのみを表示させるようにfor文を書き換えます。

#for文を使って記事名とURLを表示する
for tag in tags:
    print(tag.a.string)     #記事名を表示
    print(tag.a.get("href"))#URLを表示

補足) 要素のメソッド

今回、取得した記事のタイトルの要素「tag」はBeautiful Soupオブジェクトになっています。

ですのでBeautiful Soupが用意してくれたメソッドがたくさん使えます。

例えば、先程使用した「tag.a.string」は「.a」と「.string」メソッドを使用しています。

aメソッド

「.a」でtagの子要素であるaタグを取得することができます。

このように選択の要素の子要素はドットの後にタグ名をつけることでとってくることができます。

stringメソッド

「.string」は要素が所持している文字列をとってくることができます。今回の場合は実際の記事のタイトル名になりますね。

getメソッド

getメソッドは引数に要素の属性(アトリビュート)を指定することで、その属性の値をとってくることが出来ます。

今回はaタグのhref属性を指定していますので、記事のタイトルについているリンクを取得していることがわかります

 

最終的なコード

#Requestsライブラリをインストール
import requests
#BeautifulSoupライブラリをインストール
from bs4 import BeautifulSoup

#Requestsを使ってWebサイトをダウンロード
r = requests.get("https://naggi.club").content

#Webサイトを解析する
soup = BeautifulSoup(r,"html.parser")

#記事のタグを取得する


#CSSセレクタを使うで要素の取得
tags = soup.select(".entry-title")


#for文を使って記事名とURLを表示する
for tag in tags:
  print(tag.prettify())
    print(tag.string)     #記事名を取得
    print(tag.a.get("href"))#URLを取得

 

今回は

  • Requestsを使ったWebサイトのダウンロード
  • BeautifulSoupを使ったWebサイトの解析
  • Webサイトの記事名とURLをスクレイピング

を勉強して、実際にWebサイトから記事名とURLをスクレイピングしてきました!!

基本的にはこのやり方で他のWebサイトもスクレイピングしてくることが出来るので、自分で挑戦してみてください!

なお、スクレイピングはWEBサーバーに自動でリクエストを飛ばすことができるツールです。

なので、たくさんのリクエストを飛ばしてしまう場合があります。マナーを守って使用しましょう。

次回はスクレイピングしてきた内容をCSVファイルに出力する方法を紹介しようと思います!

 


 

Naggi Club(ナギ倶楽部)ではプログラミング学習をサポートしております。

現役のシリコンバレーエンジニアが豊富な経験と知識により、挫折しないプログラミング学習を全力で提供します。

プログラミングに関する技術的な質問からスケジュール管理やモチベーション維持まで精一杯サポートさせていただきます。

詳しい情報はこちらからよろしくおねがいします。

東京工業大学 B3 バイオテクノロジーとかとか勉強してます 趣味は読書と旅行とプログラミングです。
投稿を作成しました 2

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る
%d人のブロガーが「いいね」をつけました。