まったくの初心者ですが、エクセルのVBAとWebクエリを駆使して、
大量(1000強)のWebページから商品情報を
エクセルへ入力していくプログラムを作成したいと考えています。
やりたいことは
(1)エクセルのA列にurlを1000個並べ
(2)プログラムを実行すると、上から順にurlへ自動でアクセス
(3)各ページの商品情報を取得(テーブルデータ)し、エクセルに入力していく
例)B列:商品名、C列:商品番号、D列:通常価格、E列:カラー展開、F列:サイズ展開
という具合に、次々と自動で商品情報を入力していくプログラムです。
エクセルのVBAとWebクエリを活用して以上のようなことをするのは可能でしょうか?
VBAにてLinkの取得や、Webクエリにてテーブルデータの取得ができるのは
わかったのですが、自動でアクセスして、表ではなく区切り線ごとにデータを並べたいのです。
もし可能でしたらどのようにすれば可能になるか教えていただけないでしょうか。
不可能だとした場合は、何か可能になる方法をご教唆いただけないでしょうか。
お手数ですが、ご回答よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
可能です。
単純に、Webクエリでテーブルデータを取得する操作をマクロに記録してみてください。
記録してVBAで確認し、Webクエリのコード内容はGoogleに検索かければたくさん情報が載っています。
で、その1000件というのは同じサイトの各ページのことですか?
例えばYahooファイナンスのように日経225の情報が数十日単位で載っているので
ページをURLの中のパラメータを変更させることでループ処理して取得します。
このへんのループ処理とかわかりますか?
また、WebクエリじゃなくてもサイトのURLを解析して情報を取得する方法もあります。
テーブルがない場合はこちらの方法じゃないとダメですがVBAだけで完結できます。
Webクエリの場合は一度シートに読み込んで、VBAでそのシートのセルに記載された情報をVBAで編集する感じになります。
まずは「Webクエリ vba」で検索してみましょう。
回答ありごとうございます!
なんとなくイメージがわかってきました。
対象にしているのはこちらのサイトです。
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へコピペし、ひとつ目のテーブルのデータはなんとか取り込めましたが、ループの仕方というのがわからないので全商品の取得までは至っていません。
申し訳ありませんが、ループ処理というのを教えていただけないでしょうか。
お手数ですが、よろしくお願いいたします。
No.2
- 回答日時:
ネットショップの商品を全て取得するのですか…。
この場合はちょっと大変ですね。
というのも、Yahooファイナンスの日経225のページにあるようなデータは
そのページのURLに「意味のある」パラメータがあるのでそれを変更することで全ての情報を得ることが可能です。
例えば
http://info.finance.yahoo.co.jp/history/?code=13 …
というのは、?以降がパラメータです。
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を準備し、求める情報を入手することを目標に超微速ながら前に進んでいこうと思っています。
こんなド素人の思いつきに親切に解説いただき感謝いたします。本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) エクセルデータからの必要項目抽出方法を教えてください 6 2022/08/12 15:55
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- Excel(エクセル) 【エクセル」 特定のセルで条件抽出した列を、別シートに上から詰めて表示したい。 8 2022/04/08 16:00
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Excel(エクセル) エクセルで沢山のレコードの最後に追記するには? 7 2023/04/10 13:27
- Visual Basic(VBA) 【VBA】複数行あるカンマ区切りのデータを全て縦に一列に並べたい 5 2022/04/13 17:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
DTOとEntityの差は何ですか。
-
「外部データの取り込み」とい...
-
ActiveReportのサブレポート機...
-
Strutsで画面に表示した値の再...
-
【C#】DataGridViewの最大列数...
-
ユーザーフォームへの文字の表...
-
WordでExcelデータを差込...
-
IEを使わないでhtmlテキストを...
-
Dosブロンプトでtabを出力したい
-
Yahoo! JAPAN IDを新規取得でき...
-
ps3で久しぶりにCDの音楽情報取...
-
ミュージックのアートワークを...
-
shシェルスクリプト 空白行の...
-
Excel VBA:特定の文字列以降(...
-
アクセスの度にIPアドレスを変...
-
phpでcookieがうまく保存されない
-
不正競争防止法に該当するので...
-
「取得先」という表現について
-
XMLのタグの有無をPHPで判定し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
wordの差し込み印刷で文字...
-
DTOとEntityの差は何ですか。
-
excel access連携 このテーブル...
-
【C#】DataGridViewの最大列数...
-
WordでExcelデータを差込...
-
ActiveReportのサブレポート機...
-
「外部データの取り込み」とい...
-
VBA内でのGetPixelを使用した時...
-
GridViewからチェックボックス...
-
Windowsのマクロプログラムで、...
-
INIファイルに一括書き込みを行...
-
VB 音の波形を取得する関数は?
-
EXCEL VBAで NHK NEWSの NEWSデ...
-
JavaからPHPへの値の受け渡し
-
★お手上げ状態です。助けてくだ...
-
Access2000 CopyFromRecordset...
-
MSFlexGridのデータを初期化し...
-
rsyncでのエラー(sh: rsync: no...
-
URLエンコードされなかったパラ...
-
回線速度が64kbpsだったら、64k...
おすすめ情報