オンライン健康相談、gooドクター

私はネットショッピングが大好きで、普段からAmazon、楽天、Yahooショッピングなどで買い物しております。

ネットショッピングで買い物するようになって気づいたのですが、サイトが違うと、同じ商品にも関わらず値段が全然違うのですね。(もちろんですが...)

同じ商品の価格を比較してくれる「価格.com」のようなサイトもあるのですが、私が普段買い物するような商品は価格.comに載ってないような商品やサイトもあるため、自分でネットサーフィンしながら、安いサイトで買っています。

その際に、商品が同じであるかどうかは写真だけでは判りません。そこで使っているのが、「JANコード」です。
これは商品ごとに割り当てられた13ケタの数字なので、商品名や写真で同じ商品か分かりにくい場合にも判別することができました。

最近スクレイピングというテクニックの存在を知りました。
もちろん相手のサイトに迷惑がかからないように気を付けないことは承知しております。
岡崎図書館事件の様なことにならないために、スクレイピングするのは一回限りです。

私がやりたいことですが、Lohacoのサイトで商品の一覧から、
(1)商品名(2)値段(3)JANコード(4)URL
以上の4つを抜き出して、エクセルにまとめることは可能でしょうか?
また可能の場合は、どのようなプログラミングで出来ますでしょうか。

LOHACOホーム>コスメ・スキンケア・美容>スキンケア・基礎化粧品>化粧水>エイジング化粧水
http://lohaco.jp/g4/55-5501-5501004-55010040002/ …

例えば以上のページです。このページにはスキンケア用品が74商品登録してあります。(現時点)
最終的にはExcelのA列に商品名、B列に値段、C列にJANコード、D列にURLを抜き出したいです。


私はこれまでプログラミングを勉強したことがなかったため、かなりハードルが高かったです。
いちを「データを集める技術(佐々木拓郎 著)」と「ExcelVBAでIEを思いのままに操作できるプログラミング術」という本を購入して勉強してみました。
しかしプログラミングの知識が全くないまま進んで行ったために、一か月くらい勉強しましたが、途中で挫折してしまいました。
また、VBAの基本から勉強しないと思い「Excel VBA 本格入門」という本を勉強しましたが、こちらは一通り理解することができました。


既存のスクレイピングツールを色々試したのですが、「Octoparse」というツールがなかなか使いやすかったです。
しかしホームページごとに構成が違ったためか、なかなか思い通りにツールが動かず、上のサイトのJANコードを抜き出すことができませんでした。

回答を頂ければ幸いです。よろしくお願いいたします。

補足もしプログラミングにお詳しい方がいらっしゃいましたら、一つの例として参考にさせて頂きたいので、上記の質問が解決できるプログラミングをご教授頂けると嬉しく思います。

※言語は問いませんので、幅広い回答をお待ちしております。

gooドクター

A 回答 (1件)

kenta312さん


こんにちは。

以下サンプルプログラムですが、「参照設定」とか「プログラムの見やすさ」等々は手を抜いています。
自分なりにプログラムを整理して下さい。

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)     
Sub testIE()
 Dim I         As Long
 Dim J         As Long
 Dim objIE       As Object
 Dim URL件数      As Long
 Dim URL配列(100)   As String
 Set objIE = CreateObject("Internetexplorer.Application")

 objIE.Visible = True
 objIE.navigate "http://lohaco.jp/g4/55-5501-5501004-55010040002/ …
 Do While objIE.Busy = True Or objIE.readyState <> 4 '読み込み待ち
  DoEvents
 Loop
 Call Sleep(1000)

 URL件数 = objIE.Document.getElementsByClassName("itemBox").Length
 For I = 0 To URL件数 - 1
  URL配列(I + 1) = objIE.Document.getElementsByClassName("itemBox")(I).getElementsByTagName("A")(0)
 Next I
 For I = 1 To URL件数
  objIE.navigate URL配列(I)
  Do While objIE.Busy = True Or objIE.readyState <> 4 '読み込み待ち
   DoEvents
  Loop
  Call Sleep(1000)

  Cells(I, "A").Select
  Cells(I, "A") = objIE.Document.getElementsByClassName("cp-product_itemName")(0).innertext
  Cells(I, "B") = objIE.Document.getElementsByClassName("sellPrice")(0).innertext
  Cells(I, "D") = URL配列(I)
  For J = 0 To objIE.Document.getElementsByTagName("TR").Length - 1
   If objIE.Document.getElementsByTagName("TR")(J).innertext Like "*JANコード*" Then
   Cells(I, "C") = "'" & Trim(objIE.Document.getElementsByTagName("TR")(J).getElementsByTagName("TD")(0).innertext)
    Exit For
   End If
  Next J
 Next I
 objIE.Quit
 Set objIE = Nothing
End Sub
    • good
    • 0
この回答へのお礼

jcctaira様

ご返信ありがとうございます。

サンプルとして作って頂いたマクロを試させて頂きました。
私がやりたかったことがドンピシャで出来たので本当に驚いてしまいました。
というか、Excel VBAで実現できたことに驚いております。
スクレイピングの本は、PythonやRubyでしか出ていなかったので諦めかけていました。

やはり、IE操作のgetElement系の命令で処理できるんですね。
まだまだ分からなかった部分が多いのですが、勉強していきたいと思います。

本当にありがとうございます。

お礼日時:2017/01/19 15:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング