見出し画像

【Python】初心者向けーWebスクレイピングの基礎

会計Cityboyです。

今回はPythonでできるWebスクレイピングについて解説していきます。

はじめに

Webスクレイピングとはなんぞやというと、ウェブサイトから情報を取得する技術のことを言います。

このスクレイピングの技術は、マーケティングにおける商品情報やクチコミの情報分析や架電リストの作成などに使用されています。

実際、スクレイピングやクローリング(インターネット上のWebサイトをプログラムが巡回すること)を代行するサービス(例:Octoparse)も登場しています。

またスクレイピングした情報を定期的にSlackへの通知したりメールに通知したりすることも可能です。

この記事では、Python超初心者〜初心者の方を対象として、Webスクレイピングの基本的な事項を解説していきます。したがって、Pythonの環境構築や基本的な内容の説明も一部挟みながら記事を書いていきます。

【超重要】Webスクレイピングにおける注意点

Webスクレイピングは非常に便利な技術なのですが、利用にあたり注意点があります。

まずスクレイピングをサイト側が利用規約で禁止しているのに行った場合、損害賠償請求を受ける可能性があります。また、スクレイピング先のサイトに過剰な負荷を与えるようなプログラムを記述することは絶対に避けましょう。さらにスクレイピングの目的はあくまでも情報解析に限るようにしましょう。

スクレイピングの法律的な観点からの注意事項はこちらのリンクが役立ちます。

1. Pythonの環境構築をしよう

Pythonをインストールされていない場合は、まずPythonの環境構築をしていきましょう!

といっても、Pythonの環境構築については多くの既存記事があるので、今回はその中でもおすすめ記事とおすすめの方法の概略を説明します。

おすすめ記事(Windows)はこちら

おすすめ記事(Mac)はこちら

おすすめの方法はAnacondaをインストールして、AtomもしくはVSCodeを使用してコードを書き(以降の解説ではAtomを使用します)、Anaconda Prompt(Macの場合はコマンドプロンプト)でPythonを実行する方法です。

2.さっそくスクレイピングのプログラムを実行してみよう!

Anacondaインストールしてもらって早々にプログラム実行を行う鬼畜プレイです。やって体感するのが一番いいと思うので、やってみましょう!

#ライブラリのインポート
import requests
import lxml.html

#Yahooニュースの一番上のニュースタイトルを取得する
target_url = 'https://www.yahoo.co.jp/'
r = requests.get(target_url)
html = lxml.html.fromstring(r.text)
title1 = html.xpath('//*[@id="tabpanelTopics1"]/div/div[1]/ul/li[1]/article/a/div/div/h1/span')

#取得したタイトルの表示
print(title1[0].text)

実行方法としてはいくつかあるのですが、以下のやり方がいいかと思います。

Atomを開いて、新規ファイルを作成し上記のコードをコピペ&名前をつけて保存で拡張子を.pyとして保存

・テキストエディタを開いて、上のコードをコピペして保存&拡張子を.pyに変更

上記のプログラムを実行すると、yahooニュースの最上部の情報を取得することができます。

3. スクレイピングのプログラムはどういう風に書いていけばいいのかー静的なサイト編

ここではスクレイピングのプログラムの仕組みについて簡単に解説します。

スクレイピングで利用するライブラリは色々あり、サイトが静的か動的かや、サイトの構造によって選択します。動的なサイトとは、例えばクリックによって画像や文字が表示されたり、時間経過によって表示が変化するようなサイトを言います。静的なサイトは動的なサイト以外の普通のサイトと思っていただいてOKです。

今回はまずスクレイピングの基本となる静的なサイトのスクレイピング方法の解説を行います。静的なサイトではBeautifulSoup、lxmlといったライブラリがよく使われますが、今回は理解が最も簡単(だと個人的に思っている)なlxmlを利用した方法をお伝えします。

3.1. コードの構造

まずライブラリをインポートします。ライブラリとは、ある目的のために機能をまとめたパッケージの総称を指す言葉です。イメージ的には「道具箱」が近いと思います。

今回はrequestsというHTTPライブラリとxml や html を扱うためのライブラリであるlxmlライブラリをインポートします。

#ライブラリのインポート
import requests
import lxml.html

次に取得したいページのHTMLを取得します。細かい説明は省略しますが、target_urlに取得したいページのURLを入れると、下のコードのhtmlに当該ページのHTMLが代入されます。

#Yahooニュースの一番上のニュースタイトルを取得する
target_url = 'https://www.yahoo.co.jp/'
r = requests.get(target_url)
html = lxml.html.fromstring(r.text)

HTMLを取得したら、次にその中から取得したい要素をxpathというものを指定して取得します。xpathとはイメージ的には要素がもつ住所のようなものです。

今回取得したいyahooニュースの1行目のxpathは、'//*[@id="tabpanelTopics1"]/div/div[1]/ul/li[1]/article/a/div/div/h1/span'、となっています。これは住所で言うところの「東京都/千代田区/丸の内/1/-1/-1」のようなものです。

title1 = html.xpath('//*[@id="tabpanelTopics1"]/div/div[1]/ul/li[1]/article/a/div/div/h1/span')

そして最後に、htmlをコンソールに出力させています。

今回はコンソールに出力していますが、もちろんこれをcsvに記録したり、メール送信したりといったことも可能です。

#取得したタイトルの表示
print(title1[0].text)

4. おわりに

今回はWebスクレイピングの最も基本的な方法について記述しました。

仕組み自体は簡単なので、あとはWebページの構造にあわせてどのように情報を取得していくかを考えていくことが重要になります。

次回以降の記事では、動的なサイトのスクレイピング、csvファイルへの書き出しやGmailへの送信などより実践的な内容をまとめていきたいと思います。



この記事が気に入ったらサポートをしてみませんか?