トップページ > windows > microsoft office > EXCEL > VBA > エクセルでWEBサイトのデータを扱う

「トップページ/windows/microsoft office/EXCEL/VBA/エクセルでWEBサイトのデータを扱う」の編集履歴(バックアップ)一覧に戻る

トップページ/windows/microsoft office/EXCEL/VBA/エクセルでWEBサイトのデータを扱う - (2011/03/10 (木) 12:47:07) のソース

最終更新日時&date() &link_edit(text=ここを編集)

#html2(){{{{{{
<TABLE align="right">
<TR>
<TD>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=tomokazu0525-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4789818772" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</TD>
<TD>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=tomokazu0525-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4883376435" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</TD>
</TR>
</TABLE>
}}}}}}

「WEBサイトのデータを、そのまま、または必要な一部分を抜出(取得)してエクセルに貼り付けたい。」というとき用のメモ。
いわゆる、スクレイピング、スパイダリングをエクセル(VBA)でやってやろうという話。
なお、スクレイピング関連用語の詳細や、他のプログラミング言語でデータ取得する方法は、[[ 別ページ >http://www42.atwiki.jp/tomokazu0525/pages/57.html]]に簡単にまとめている。

■目次
#contents_line()

■本文
*■ページの概要
「WEBサイトのデータを、そのまま、または一部を抜き出してエクセルに貼り付けたい。」というとき用のメモ。

ここのページでは、エクセルの機能を利用する方法をまとめている。
関連ページ:[[VBA以外も利用してWEBから情報の抜き出し(スクレイピング、スパイダリング) >http://www42.atwiki.jp/tomokazu0525/pages/57.html]]

**想定シーン
・株取引を初めとしたWEBを使ったEDI(Electronic Data Interchange )のフローの一部
・大量の情報収集


エクセルでやる方法を大きくわけると、
**(a).VBAを利用しない。
[[データー-外部データの取り込み-新しいwebクエリ >http://www.1147mono.com/Excel/katsuyou_07.htm]]
コメント:VBAと組み合わせないと、手作業をやめるメリットがないのでは。

**(b).エクセルVBAを利用する。
VBAを利用する方法は、さらにざっくり3つにわけて説明。
***(b)-1.VBAでIE(Internet Explorer)を操作する。
通信コンポーネントを使う場合と比較すると、
良い点:扱えるサイトの範囲が広い。(IEで表示できるほぼ全てのページを扱える。)
悪い点:処理に時間がかかる。

***(b)-2.VBAで通信コンポーネントを利用する。
 wininet,winhttp(Windows HTTP Services),XMLHttpなど。
[[Windows HTTP Servicesとは 【WinHTTP】 - 意味/解説/説明/定義 : IT用語辞典 >http://e-words.jp/w/Windows20HTTP20Services.html]]
API関数と表記してあるサイトもある。

良い点:一旦書き上げてしまえば、処理が早い。
悪い点:
・プログラムが複雑になりやすい。(たぶん。)
・扱えないサイトがある。(cookieの処理など。)

***(b)-3.WebBrowserコントロール
詳細不明。あまりメリット感じられないので、深堀しない。
メリットデメリットをまとめたページ:[[ 【Excel VBA備忘ログ】WebBrowserコントロールの使用: ★ ダメ株主 Z ★ >http://app.f.m-cocolog.jp/t/typecast/37471/36872/41516185]]

*■0.基礎知識
**呼び方(追加で検索するためのキーワード)
WEBページからの抽出は、ある程度確立してきている分野らしく、さまざまな呼び名がつけられている。
■英語:日本語よみ
・scraping:スクレイピング
・(web)data mining:(ウェブ)データマイニング
・web harvesting:ウェブハーベスティング
・spidering:スパイダリング

**IEの構造(IE関係のメソッドとプロパティ)
[[勉強用メモ - トップページ/windows/microsoft office/IE(internet explorer) >http://www42.atwiki.jp/tomokazu0525/pages/322.html]]


*■1 HTMLで構成されたWEBページをVBAで扱う。
流れ
1-1.HTMLをダウンロード
1-2.ダウンロードしたファイルを処理

**1-1.HTMLをダウンロード
ダウンロードするには、いくつか方法がある。
・VBAでIEを操作する。
・VBAで通信コンポーネントを利用する。(wininet,winhttp,XMLHttpなど。)
色々なコンポーネントがあるが、長所・短所は調査中。

***IEにWEBページを表示させ、コピペする。
[[クリップボードを操作する(2)>http://officetanaka.net/excel/vba/tips/tips81.htm]]
サイト名:office TANAKA
[[エクセルVBAとWEBクエリを駆使し、WEBページからデータを次々とエクセルへ入力するプログラムを作成したい>http://q.hatena.ne.jp/1231502852]]
サイト名:人力検索はてな
[[IE.Document.frames>http://invest-prg.rich-prj.com/p_progtip/ie_ctrl.html#frames]]
サイト名:[[投資プログラマー’S WEB InternetExplorer操作によるコントロールへのアクセス >http://invest-prg.rich-prj.com/p_progtip/ie_ctrl.html]]

IEを非表示にした方がマシンに負荷をかけずに動かせる。
ただし、IEを非表示で動かす際には、自動クラッシュ機能をオフにしておくべき。
>自動クラッシュ回復機能をオフにするには次のようにします。
>1.Internet Explorer の [ツール] ボタンをクリックし、[インターネット オプション] をクリックします。
>2.[詳細] タブをクリックします。
>3.[ブラウズ] セクションで、[自動クラッシュ回復機能を有効にする] をオフにします。
>引用元:[[ Internet Explorer 8: プライバシー >http://www.microsoft.com/windows/products/winfamily/ie/ie8/ja-jp/ieprivacy_8b2.mspx]]
理由:IEを表示にしておけば、何かあった場合、目視でブラウザを閉じれる。
IEを非表示にしてしまうと、目視ではブラウザが閉じれない。
結果、CPUとメモリを使用し続けるため、パソコンが遅くなる。



***winhttpライブラリを使ったHTMLダウンロード
>WinHTTP は、古参の HTTP ライブラリ WinInet の後継ライブラリです。ただし、必ずしも下位互換ではないため、場合によっては WinInet との使い分けが必要になる場合もあるようです。引用元:[[WinHTTP ライブラリで Web スクレイピング(1)~ GET 編~ | YU-TANG's MS-Access Discovery >http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html]]

記事名:[[WinHTTP ライブラリで Web スクレイピング(1)~ GET 編~>http://www.f3.dion.ne.jp/~element/msaccess/AcTipsWinHTTP1.html]]
記事名:[[ Cookie Handling in WinHTTP>http://msdn.microsoft.com/en-us/library/aa383261(VS.85).aspx]] msdn
記事名:[[WinHTTP (Windows HTTP Services) 覚書>http://www2.wbs.ne.jp/~kanegon/doc/winhttp.txt]]
[[Excel/VBAでマクロでPOSTした結果をファイルに落とす - 日記ちゃん >http://d.hatena.ne.jp/tomopo/20090717/1247824294]]
[[     Using the WinHttpRequest COM Object  (Windows) >http://msdn.microsoft.com/en-us/library/aa384079(v=VS.85).aspx]]


***wininet
>Webページのデータを取得し加工したい場合がありますが、IEを使ったり、ActiveX(WebBrouser)コントロールなどを使うと、簡単に受信できる反面、余計な画像も取得されて動作が非常に遅くなります。ここでは、WinInetのAPI関数で直接HTTPによりデータを受信します。
>引用元:[[ WinInetによるHTTPデータの受信>http://mt-soft.sakura.ne.jp/web_dl/vb-parts/get_http/]]
[[1.FTPやHTTPを使うときの基本(InternetOpen, InternetCloseHandle) >http://www.happy2-island.com/access/gogo03/capter90100.shtml]]
[[2.HTTPやFTPサーバへ接続するには(InternetConnect) >http://www.happy2-island.com/access/gogo03/capter90200.shtml]]
[[4.1 HTTPサーバへリクエストを送信する(HttpOpenRequest, HttpSendRequest) (get形式)>http://www.happy2-island.com/access/gogo03/capter90401.shtml]]
[[4.4 POST形式でリクエストを送信する(HttpOpenRequest, HttpSendRequest) >http://www.happy2-island.com/access/gogo03/capter90404.shtml]]

この本に色々載ってそう。
[[VBAによるTCP/IPプログラミング入門 >http://www.cqpub.co.jp/hanbai/books/18/18771.htm]]
第5章 WinInet APIを利用したTCP/IPプログラム



***MSHTMLライブラリおよび、createDocumentFromUrlを使う方法。
[[VBAでHTMLをダウンロードしてタグ解析する方法  タケのIT技術日誌 >http://tiger-ti.jugem.jp/?eid=2]]
[[Web ページをダウンロードする方法~ MSHTML 編>http://www.f3.dion.ne.jp/~element/msaccess/AcTipsMSHTML.html]]


***XMLHTTP
サイト側がAPIを公開しており、その戻り値がXMLのときに使いやすい。
でも、2009年時点ではwinhttpのほうが主流みたいです。

[[Web ページをダウンロードする方法~ MSXML 編~ | YU-TANG's MS-Access Discovery >http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html]]
[[VBAからPOSTの値を渡してURLを実行できますでしょうか。。 - Insider.NET - @IT >http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=23492]]

>XMLHttpRequest は、MSXML ライブラリが提供する、COM オブジェクト 引用元:[[XMLHttpRequest を作成する - Entering Passive Mode >http://fireball.loafer.jp/kes/article_220.html]]

>XMLHTTPはリダイレクトをうまく扱えない
[[解説 : XMLHttpRequest >http://ponpon-village.net/ajax/xmlhttp.htm]]
扱う対象がXMLという意味ではなく、戻り値がXML。らしい。


***XMLHttpRequest
>MSXML は XMLHttpRequest の実装を 2 種類用意している。それは、「XMLHTTP」「ServerXMLHTTP」だ。 引用元:[[XMLHttpRequest を作成する - Entering Passive Mode >http://fireball.loafer.jp/kes/article_220.html]]



***ServerXMLHTTP
>WinHTTP と呼ばれる API を基盤とする実装だ。
>WinHTTP は、当初はサーバ間の HTTP 通信のために作成され、
>WinInet よりもセキュリティ面で安全なように、
>Cookie やキャッシュなどの情報は一切共有しない。
>引用元:[[XMLHttpRequest を作成する - Entering Passive Mode >http://fireball.loafer.jp/kes/article_220.html]]



**1-2.ダウンロードしたHTMLファイルを処理する。
HTMLに関しては、XPATH式を適用するのは難易度が高く、手間がかかる。
[[勉強用メモ - EXCEL/VBA/CSSセレクタ >http://www42.atwiki.jp/tomokazu0525/pages/98.html]]

[[勉強用メモ - トップページ/windows/microsoft office/EXCEL/VBA/XPATH >http://www42.atwiki.jp/tomokazu0525/pages/94.html]]


*■2.VBAからXML(XTHML,XBRL)を扱う。
[[勉強用メモ - トップページ/windows/microsoft office/EXCEL/VBA/XML >http://www42.atwiki.jp/tomokazu0525/pages/323.html]]
[[勉強用メモ - トップページ/windows/プログラミング/XBRL >http://www42.atwiki.jp/tomokazu0525/pages/167.html]]




*■3.面倒なページ
**A.FRAMEのあるWEBページ
[[Frame プロパティ>http://msdn.microsoft.com/ja-jp/library/system.windows.controls.frame_properties.aspx]]
サイト名:MSDN
[[frames Collection>http://msdn.microsoft.com/en-us/library/ms537459(VS.85).aspx]]
サイト名:MSDN


[[三流君VBAでIE操作 フレーム操作 Document.Frames>http://www.ken3.org/cgi-bin/group/vba_ie_frame.asp]]
サイト名:
[[InternetExplorer操作 Frameと遊ぶ Objectを探る方法>http://www.ken3.org/vba/backno/vba116.html]]
[[IE.Document.frames>http://invest-prg.rich-prj.com/p_progtip/ie_ctrl.html#frames]]
サイト名:[[投資プログラマー’S WEB InternetExplorer操作によるコントロールへのアクセス >http://invest-prg.rich-prj.com/p_progtip/ie_ctrl.html]]

フレームの属性の見つけ方(英語)。機械翻訳の日本語もあるが、翻訳がお粗末すぎて余計にわからん。
[[How To  Find the src Attribute of a Frame Element >http://support.microsoft.com/?scid=kb%3Ben-us%3B297950&x=9&y=18]]


**B.クリック等でページ遷移など表示が変化するWEBページ 
***スクリプト言語javascript
[[Excel→Javascriptポップアップウィンドウへの入力について>http://www.moug.net/faq/viewtopic.php?t=37039]]

[[win32 ウィンドウ>http://msdn.microsoft.com/ja-jp/library/cc410656.aspx]]

[[IE SELECT後 .fireEventでJavaScriptのイベントを起動>http://www.ken3.org/vba/backno/vba155.html]]

***ログイン等が必要なページ
[[ 三流君VBA:InternetExplorer.application操作 .Clickでクリック >http://www.ken3.org/vba/backno/vba097.html]]

*4.(補足)画像ファイルなどのファイルを扱う。
HTMLの文字列だけではなく、ファイルを扱う方法。
[[三流君VBA:URLDownloadToFile APIを使用してWebからファイルをダウンロードしてみた >http://www.ken3.org/vba/backno/vba120.html]]
[[VBAでスクレイピングして画像をダウンロードしてシートに貼り付ける >http://www.simple-sys.com/blog/2008/04/26/338/]]
サイト名:[[simple blog いろいろ勉強中   >http://www.simple-sys.com/blog/]]


*未整理

[[三流君VBAでIE操作 メルマガ バックナンバー 全て>http://www.ken3.org/cgi-bin/group/vba_ie_backno.asp]]

***IE:その他
[[Excel VBAのマクロで,IEを自動操作しよう (DOMセレクタ関数をVBAで自作>http://d.hatena.ne.jp/language_and_engineering/20090710/p1]]
コメント:ページ中段の「IE自動操作用の関数ライブラリを作ろう」のコーナーが役立つ。
[[複数起動させたIEのイベントを拾うには>http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200511/05110061.txt]]
[[VBAでIEのページを印刷可能?>http://www.moug.net/faq/viewtopic.php?t=38664]]

ページタイトル:[[IEオブジェクトを作る(IE7編)>http://www.happy2-island.com/vbs/cafe02/capter00711.shtml]]
サイト名:[[Happy!Happy!Island>http://www.happy2-island.com/]]


■関連用語
#XMLSS:スプレッドシートスキーマ
「Excel本来のxls形式に準じるような多くの情報をXMLとして保存し、そしてまたxls形式と同様にアイコンをダブルクリックすればExcelが立ち上がるようなファイル形式」
http://park18.wakwak.com/~little-box/xml_basic/8-009.htm

■関連ツール
[[URLエンコード・デコードフォーム>http://www.tagindex.com/tool/url.html]]




&link_edit(text=ここを編集) 
*ページフッタ
**このページの1階層上のページ
&link_parent() 
**このページの1階層下のページ
#lsd()
**このページに含まれるタグ
&tags()
**このページへのアクセス数
今日:&counter(today)
昨日:&counter(yesterday)
これまで合計:&counter(total)