- ベストアンサー
エクセルVBAとWEBクエリで大量のWebページから商品情報を自動で取得する方法はあるか?
- エクセルのVBAとWebクエリを活用して大量のWebページから商品情報を自動で取得する方法はあるのかについて調査しています。
- VBAにてLinkの取得や、Webクエリにてテーブルデータの取得は可能ですが、自動でアクセスして区切り線ごとにデータを並べる方法については調査中です。
- もし自動でアクセスして区切り線ごとにデータを並べる方法が不可能な場合、他の可能な方法を検討しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
可能です。 単純に、Webクエリでテーブルデータを取得する操作をマクロに記録してみてください。 記録してVBAで確認し、Webクエリのコード内容はGoogleに検索かければたくさん情報が載っています。 で、その1000件というのは同じサイトの各ページのことですか? 例えばYahooファイナンスのように日経225の情報が数十日単位で載っているので ページをURLの中のパラメータを変更させることでループ処理して取得します。 このへんのループ処理とかわかりますか? また、WebクエリじゃなくてもサイトのURLを解析して情報を取得する方法もあります。 テーブルがない場合はこちらの方法じゃないとダメですがVBAだけで完結できます。 Webクエリの場合は一度シートに読み込んで、VBAでそのシートのセルに記載された情報をVBAで編集する感じになります。 まずは「Webクエリ vba」で検索してみましょう。
その他の回答 (1)
- suffre
- ベストアンサー率28% (259/919)
ネットショップの商品を全て取得するのですか…。 この場合はちょっと大変ですね。 というのも、Yahooファイナンスの日経225のページにあるようなデータは そのページのURLに「意味のある」パラメータがあるのでそれを変更することで全ての情報を得ることが可能です。 例えば http://info.finance.yahoo.co.jp/history/?code=1321.O&sy=2012&sm=7&sd=2&ey=2012&em=9&ed=30&tm=d&p=2 というのは、?以降がパラメータです。 code=1321.Oというのは「1321番の銘柄」、.Oというのは「大証」という意味です。 続けて&というのはパラメータの区切りなので、その後のsy=2012やsm=7などが各パラメータになります。sy=2012は2012年の意味ですね。 例として頂いた h●●p://shop.aimerfeel.jp/pc/index.php?toid=PC_ARTICLE&fromid=OUTSIDE&group_id=370601 というURLですが、これも?以降がパラメータで&は区切りなので toid=PC_ARTICLE fromid=OUTSIDE group_id=370601 の3つがパラメータになります。 憶測ですがtoid=PC_ARTICLEはたぶんPCサイトや携帯サイトの区分で、fromid=OUTSIDEはリンク元がどこからかという意味だと思います。 group_id=370601はそのままこの商品のIDですね。 で、toid=PC_ARTICLEとfromid=OUTSIDEは何も変更する必要はないんですが、group_id=370601をどこからか情報を取ってこないといけないです。 というのもこの商品のIDがたまたま370601というだけで、日経225のページのsy=2012のように意味のある数値ではないからです。 ではどこから商品IDを見つけるかというとトップページのリンクから辿って見つけるしかないです。 当然ですがトップページには全ての商品のリンクがあるわけではありません。 リンクを次々と辿っていって商品IDを見つけるしかないんです。 もちろんこれをVBAでやることも可能です。 ですがこれをやるにはhtmlを解析する必要があります。 これを「スクレイピング」といいます。「vba スクレイピング」「html スクレイピング」「web スクレイピング」などで検索してみてください。 スクレイピングで解析するには正規表現や文字列抽出などを駆使してやる必要があり、そのサイトのリンクパターンを自分で見つける必要があります。 これはかなり難易度が高いです。 さらにhtmlをjavascriptで生成している場合はとても厄介です。 私はアメリカの某巨大ショッピングサイトを解析したことがありますが、htmlは膨大なコードの山でしたがその中から商品パターンを見つけ出して解析できましたがかなり難解でした。 本当はこのような行為はハッキングに近いので、かなりグレーな行為なんです。 そのショップが利用しているサーバーによっては短時間に多くのリクエストを発行するような ipアドレスに対して通信を遮断するところもあるので注意が必要です。 ちなみにループ処理というのは、同じような処理で内容を少しずつ変えて何回も処理することを言います。 先ほどの日経225のページでは、パラメータの値を変えることで引き出せる情報が変わります。 1000ページ分のURLを用意するのではなく、 http://info.finance.yahoo.co.jp/history/? までは同じURLをで?以降のパラメータを変えるという処理をすれば数行のコードで1000ページ分のURLを 用意したのと同じことになります。
お礼
引き続きご回答いただきありがとうございます。 しかし、、、むむむ、、、なるほどですね。。。 確かに商品IDにはあいまいな法則があるだけで、明確さはありませんね。それを準備しないことには、ループ処理で自動化は難しいということですね。 商品の総数は700~800点程度だと思われますので、教えていただいたスクレイピングの記事もいくつか読んでみましたが、今の私には手作業で商品IDを抜き取っていく方が早いかもしれません(笑) しかしながら、こちらへの質問をきっかけにこの数日間様々な情報に触れ、山の高さを思い知ると同時に、霧の向こう側のおぼろげな輪郭もなんとなく解ってきました。 商品IDを準備し、求める情報を入手することを目標に超微速ながら前に進んでいこうと思っています。 こんなド素人の思いつきに親切に解説いただき感謝いたします。本当にありがとうございました。
お礼
回答ありごとうございます! なんとなくイメージがわかってきました。 対象にしているのはこちらのサイトです。 h●●p://shop.aimerfeel.jp/ こちらの各商品のページでひとつ目のテーブルの中にある 商品番号や価格などのデータと、ふたつ目のテーブルにある素材や仕様などのデータを一列にまとめたいと思っています。 ループ処理はわかりませんが、 ご助言いただいたように「Webクエリ vba」で検索し、 h●●p://fuedakaoru.blogspot.jp/2012/01/web.html ↑このサイトにあるやり方で下記のコードを作成してみました。 まずカラー展開の一番多い商品番号「370601」を対象に ---------------------- Sub Macro1() Cells.Select If Cells(1, 1) <> "" Then Selection.QueryTable.Delete End If Selection.ClearContents With ActiveSheet.QueryTables.Add(Connection:= _ "URL;h●●p://shop.aimerfeel.jp/pc/index.php?toid=PC_ARTICLE&fromid=OUTSIDE&group_id=370601" _ , Destination:=Range("A2")) .Name = "index.php?toid=PC_ARTICLE&fromid=OUTSIDE&group_id=370601" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False .RefreshStyle = xlOverwriteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlSpecifiedTables .WebFormatting = xlWebFormattingNone .WebTables = "1" .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With Range("B6").Select Selection.Copy Sheets("Sheet1").Select Range("B2").Select ActiveSheet.Paste ~~~ Sheets("Sheet2").Select Range("B34").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("I2").Select ActiveSheet.Paste Sheets("Sheet2").Select ActiveWindow.SmallScroll Down:=-24 Range("A4").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("J2").Select ~~~ Sheets("Sheet2").Select Range("A30").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("AJ2").Select ActiveSheet.Paste End Sub ---------------------- これでSheet2にひとつ目のテーブルを取り込み、各項目を Sheet1へコピペし、ひとつ目のテーブルのデータはなんとか取り込めましたが、ループの仕方というのがわからないので全商品の取得までは至っていません。 申し訳ありませんが、ループ処理というのを教えていただけないでしょうか。 お手数ですが、よろしくお願いいたします。