LogoMark.png

WebScraping の変更点


#author("2021-11-03T17:10:00+09:00;2021-11-03T17:04:52+09:00","default:inoue.ko","inoue.ko")
*Web Scraping
機械学習のためのデータ収集技術
~


**はじめに
Web Scrapingとは、Webサイトから記事情報や画像を抽出する技術のことで、Web Crawler あるいはWeb Spider とも呼ばれます。近年、機械学習に用いる学習データ(例えば犬と猫の画像)を大量に取得する目的で、この技術が必要になることが多くなりました。
~

***ご注意ください
WebScrapingは、人間が記事を読む場合と違って、プログラムが短時間に大量のリクエストを行います。通常の Webサーバーが想定する以上の負荷をかけることになるので((サイトによっては、無許可のスクレイピングを拒否している場合があります(例えば Twitter)。そのようなサイトでスクレイピングを行うと違反行為として罰則を受けたり、場合によっては違法な攻撃とみなされて法的処罰を受ける可能性もあります。))、アクセス頻度などを考えて相手に迷惑をかけないよう、注意が必要です。
~

***簡単な方法
Webスクレイピングというキーワードで検索すると、Python を使った方法が多くヒットしますが、作業の目的によっては、いわゆるクローラーを使えば簡単に目的が達成されます。例えば、特定のWebページにリンクされた画像の収集であれば、フリーのWebクローラーツールや、ブラウザの拡張機能を使って、簡単に実現できます。

-Webクローラーツールを使う
[[Google:Webクローラーツール]]

-ブラウザの拡張機能を使う
--Firefox アドオン
---[[DownThemAll>https://addons.mozilla.org/ja/firefox/addon/downthemall/]]
---[[WebScrapbook>https://addons.mozilla.org/ja/firefox/addon/webscrapbook/]]
--Chrome 拡張機能
--[[Scraper>https://chrome.google.com/webstore/detail/scraper/mbigbapnjcgaffohmbkdlecaccepngjd]]
~
~

**[[Python]] でプログラムを書く
Pythonでは [[Scrapy>Google:Python Scrapy]] という有名なフレームワークがありますが、フレームワークというのはそれなりに学習コストがかかります。ここでは、古くから使われている、[[Requests>Google:Python Requests]] と [[BeautifulSoup>Google:Python BeautifulSoup]] のみを使って、簡単なコードでそれを実現する事例を紹介します。以下が前提となります。
-[[Python]] がインストールされている必要があります。
-[[Terminal]] を利用します(統合開発環境がある方はそれでもOKです)

以下、[[Requests>Google:Python Requests]] によるページの取得と [[BeautifulSoup>Google:Python BeautifulSoup]] による要素情報の取得の仕方について順に解説します。
~

***Requests によるページの取得
Requests は、Webページを取得・解析するためのライブラリです。

-まずは、pip コマンドで requests をインストールして下さい。
 $ pip install requests
注)Python3系であればコマンドは pip3、2系であれば pip です。

-以下のソースを ''sample.py'' として、カレントディレクトリに置いて下さい。
 import requests
 r = requests.get('https://design.kyusan-u.ac.jp/index.html',verify=False)
 print("// HEADER //////////////")
 print(r.headers,"\n")
 print("// HTML CONTENT ////////")
 print(r.content,"\n")

-プログラムの解説
--import 文で Request を読み込みます。
--requests.get()関数でurlを指定すると、ページの情報が取得できるので、これを変数 r に格納しています。
--r.header でページのヘッダー情報が取得できます。
--r.content でページの内容が取得できます。

-カレントディレクトリで以下を実行すると結果が表示されます。
 $ python sample.py
-結果をターミナル出力ではなく、テキストファイルとして書き出したい場合は、以下のようにファイル名を指定してリダイレクトして下さい。
 $ python sample.py > result.txt
~

***Beautiful Soup による要素情報の抽出
Beautiful Soup は、HTMLを指定してその情報を抽出する場合に使用します。

-まずは、pip コマンドで Beautiful Soup をインストールして下さい。
 $ pip install beautifulsoup4

-BeautifulSoup は以下のように2つの引数を指定します。
--第一引数:解析対象を指定
--第二引数:パーサを指定 "html.parser"

-以下を ''sample2.py'' として、カレントディレクトリに置いて下さい。
 import requests
 from bs4 import BeautifulSoup
 
 r = requests.get('https://design.kyusan-u.ac.jp/socialdesign/',verify=False)
 soup = BeautifulSoup(r.content, "html.parser")
 
 print(soup.find("h1"))

-プログラムの解説
--import で Request を、また from で Beautiful Soup から bs4 モジュールを読み込みます。
--requests.get() 関数で URL の示すページの情報を読み込みます。
--ページのコンテンツを HTMLパーサーで解析して、変数 soup に格納。
//--パーサーは何を元に解析するかを意味する語で、この事例では HTMLの解析なので html.parser と記載しています。
--soup.find でタグ指定すると、当該部分(先頭のひとつ)を表示できます。

-カレントディレクトリで以下を実行すると結果が表示されます。
 $ python sample2.py
 <h1 id="pageTitle"><a href="・・">SocialDesign</a> </h1>

-プログラムの最終行を以下のようにすると、テキストのみ抽出されます。
 print(soup.find("h1").text)

-soup.find では、先頭の1つしか選ばれませんが、soup.find_all を使うと、すべてのタグを抽出できます。以下のソースでは、h3 タグのテキストをすべて抽出します(最後の2行が異なるだけです)。
 import requests
 from bs4 import BeautifulSoup
 
 r = requests.get('https://design.kyusan-u.ac.jp/socialdesign/',verify=False)
 soup = BeautifulSoup(r.content, "html.parser")
 
 for i in soup.find_all("h3"):
     print(i.text)

~

//***画像のスクレイピング
//(書きかけです。)
~
~
~