
EXCEL(テキスト可)内に書かれた大量のキーワードを
1ワードずつ自動でGoogle検索し、
1ページ目の検索結果のリンクを1つ1つクリックしていき、
検索結果ページ内に、目的の情報があれば取得し、
EXCEL(テキスト可)に出力するといった操作を
VBAで自動で行いたいと思っています。
EXCEL2010かEXCEL2000に対応していればOKです。
検索するところまでは分かりましたが、検索結果(1ページ目のみ)
のリンクをクリックして、ページ内の目的の情報を取得する
といったところをどう記述すればよいかが分かりません。
検索するところまではこことほぼ同じように書きました。
http://vbaie.blog111.fc2.com/?mode=m&no=6
お分かりになる方、アドバイスのほど、よろしくお願いします。
No.5ベストアンサー
- 回答日時:
ちょうど正月休みでJavaScript - DOMのお勉強をしていましたので、試しにやってみました。
当方の環境(Win7Home64bit、IE10、xl2010-32bit)の環境ではお示しのコードは動きませんでした。
ソース(ページの見た目の割にとんでもなくごちゃごちゃしたソースで、自作のWebのTreeをワークシートに書き出すVBAコードを使って解析しました)を見ると、検索窓のIDや、「Google 検索」のタグも変わっている様でした。Googleさんの気分で時々変わるとすると、自力で作成できる様にお勉強していただくしかないと思います。下記で使用したidやclassnameも明日には変わっているかもしれません。
検索結果の最初の1ページ(10件分)のリンク-これも訳の分からない他のリンクが山ほど存在していて、正規表現による取得ではNGと思います-を取得して、5秒ごとにリンク先のページを表示するというところまでやってみました。ここまでで、自分の勉強に戻ります。ご参考まで。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'Googleで「VBA」と検索する
Sub GoogleSearch()
Dim objIE As Object
Dim myElements As Object
Dim i As Long
Dim urls() As String
'IE起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
'Googleに接続
objIE.navigate "http://www.google.co.jp"
'IEを待機
Call IEWait(objIE)
'検索窓に「VBA」と入力
objIE.document.getElementById("gbqfq").Value = "VBA"
'1秒停止
Sleep 1000
'検索ボタンを押す
objIE.document.getElementById("gbqfb").Click
'IEを待機
Call IEWait(objIE)
Sleep 1000
Set myElements = objIE.document.getElementsByClassName("altcts")
ReDim urls(0 To myElements.Length - 1)
For i = 0 To UBound(urls)
urls(i) = myElements(i).NextSibling.FirstChild.href
Next i
'取得したリンク先を表示する
For i = 0 To UBound(urls)
objIE.navigate urls(i)
Sleep 5000
Next i
'IE終了
' objIE.Quit
' Set objIE = Nothing
End Sub
'IEを待機する関数
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function
No.6
- 回答日時:
#5です。
getElementsByClassNameはIE9以降しか使えないそうです。
IEも9以降からようやく世間並みになってきている様ですね。とはいっても、VBAからActiveXとして利用するには、他に選択肢はありません。
JavaScriptであれば、IE8以下でgetElementsByClassNameを代替するライブラリが多々あるそうですが、VBAから使うにはそういう訳にもいきません。下記リンクの記事の関数はVBAに載せ替えられそうな気がします。IE8以下しか使えない事情がある場合のご参考まで...
http://t87r.wordpress.com/2011/02/13/getelements …
No.4
- 回答日時:
度々すいません。
あくまでも特別な事情があってIEを操作してデータアクセスしたいということで、よろしいでしょうか?
結構遠回りな方法ですので…
No.3
- 回答日時:
ソースが必要であれば、補足お願いします。
取り敢えずイメージで回答します。
1階層目の処理は出来たとのことですので省きます。
2階層目では正規表現でページ内のリンクを探し、手当たり次第配列にぶっこみます。
次に配列を呼び出してページをリクエストします。(httprequest)
3階層目では、目的の情報がどういった構造の物か解りかねますので、省きます。
※リンクをクリックするというよりは、目的のURLに対してリクエストし、Html構文を文字列で処理します。
結構メモリ食うはずですので、いらなくなった配列は順次初期化したらいいと思います。
この回答への補足
ご回答ありがとうございます。
私にはやや難しいので、下記ソースコードに追記いただきたいです。
(VBAで検索した場合の例)
ひとまず、1ページ目の検索結果の各リンクをクリックし、
現れたページ内にメールアドレスがあればメールアドレスを取得といった操作を
作っていただきたいです。ポイントを記述いただきましたら、
細かいところははしょっていただいて構いません。
’Googleで「VBA」と検索する
Sub GoogleSearch()
Dim objIE As Object
'IE起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
'Googleに接続
objIE.navigate "http://www.google.co.jp"
'IEを待機
Call IEWait(objIE)
'検索窓に「VBA」と入力
objIE.Document.getElementById("q").Value = "VBA"
'5秒停止
Call WaitFor(5)
'検索ボタンを押す
Call IEButtonClick(objIE, "Google 検索")
'5秒停止
Call WaitFor(5)
'IE終了
objIE.Quit
Set objIE = Nothing
End Sub
’ボタンを押す関数
Public Function IEButtonClick(ByRef objIE As Object, buttonValue As String)
Dim objInput As Object
For Each objInput In objIE.Document.getElementsByTagName("INPUT")
If objInput.Value = buttonValue Then
objInput.Click
Exit For
End If
Next
End Function
'IEを待機する関数
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function
'指定した秒だけ停止する関数
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date
futureTime = DateAdd("s", second, Now)
While Now < futureTime
DoEvents
Wend
End Function
No.2
- 回答日時:
そこから先はちょっと難しく、Web上にもあまり載っていません。
HTMLの知識とVBAの知識がかなりないと厳しいかと思います。
for each obj in objIE.document.getelementsbytagname("A")
obj.click
next
で全てのAタグをクリックします(この方法ではクリックできないリンクもあります)。
objIE.document.body.innerText
でページ内の文字列全てを取得します。
if instr(objIE.document.body.innerText,"○○")>0 then
debug.print objIE.document.body.innerText
end if
で、文字列に○○があったら、ページ内の文字列全てを取得します。
あとは、HTMLソースを表示して中を解析し、
objIE.document.getelementbyid("").~
objIE.document.getelementsbyname("").~
objIE.document.getelementsbyclassname("").~
などで必要な部品を動かします。
これらを複合的に利用して記述します。
この回答への補足
ご回答ありがとうございます。
確かに難しいですね。組み合わせればできそうではありますが・・・。
検索でもヒントとなるサイトがなかなか見つかりませんでしたし。
だからこのQ&Aで解決できればと思っています。
もし可能でしたら、下記ソースコードに追記いただきますと助かります。
(VBAで検索した場合の例)
’Googleで「VBA」と検索する
Sub GoogleSearch()
Dim objIE As Object
'IE起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
'Googleに接続
objIE.navigate "http://www.google.co.jp"
'IEを待機
Call IEWait(objIE)
'検索窓に「VBA」と入力
objIE.Document.getElementById("q").Value = "VBA"
'5秒停止
Call WaitFor(5)
'検索ボタンを押す
Call IEButtonClick(objIE, "Google 検索")
'5秒停止
Call WaitFor(5)
'IE終了
objIE.Quit
Set objIE = Nothing
End Sub
’ボタンを押す関数
Public Function IEButtonClick(ByRef objIE As Object, buttonValue As String)
Dim objInput As Object
For Each objInput In objIE.Document.getElementsByTagName("INPUT")
If objInput.Value = buttonValue Then
objInput.Click
Exit For
End If
Next
End Function
'IEを待機する関数
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function
'指定した秒だけ停止する関数
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date
futureTime = DateAdd("s", second, Now)
While Now < futureTime
DoEvents
Wend
End Function
No.1
- 回答日時:
検索結果からどのように一番目のリンクを取得するかは色々やり方あるとおもいます。
パッと思いつかないですが最初のリンクタグを文字列一致で取得するとか。
あとはそのURLに対してhttpゲットした結果を表示すれば良いかと。
この回答への補足
ご回答ありがとうございます。
できれば、下記ソースコードに追記いただくと幸いです。
(VBAで検索した場合の例)
グーグルにアクセスして検索ボタンを押して、
1ページ目を表示するところまではこちらのコードでできますが、
そこから1ページ目の検索結果のリンク(上位10ページ)を
1つ1つクリックして、目的の情報(例:メールアドレス)があるかどうか
(あるなら取得してエクセル等に出力)を確認するところの記述が分かりません。
’Googleで「VBA」と検索する
Sub GoogleSearch()
Dim objIE As Object
'IE起動
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
'Googleに接続
objIE.navigate "http://www.google.co.jp"
'IEを待機
Call IEWait(objIE)
'検索窓に「VBA」と入力
objIE.Document.getElementById("q").Value = "VBA"
'5秒停止
Call WaitFor(5)
'検索ボタンを押す
Call IEButtonClick(objIE, "Google 検索")
'5秒停止
Call WaitFor(5)
'IE終了
objIE.Quit
Set objIE = Nothing
End Sub
’ボタンを押す関数
Public Function IEButtonClick(ByRef objIE As Object, buttonValue As String)
Dim objInput As Object
For Each objInput In objIE.Document.getElementsByTagName("INPUT")
If objInput.Value = buttonValue Then
objInput.Click
Exit For
End If
Next
End Function
'IEを待機する関数
Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function
'指定した秒だけ停止する関数
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date
futureTime = DateAdd("s", second, Now)
While Now < futureTime
DoEvents
Wend
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでPDFのアクティブページ番号取得 1 2023/05/25 12:41
- Excel(エクセル) マクロVBAのフォルダ階層別で検索の方法 4 2022/04/03 23:23
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- その他(SNS・コミュニケーションサービス) Yahoo!とGoogle検索のしくみの違いを教えてください 2 2022/08/14 01:53
- Excel(エクセル) Excelについて質問です。 シート1の検索値例えば *ABC* をシート2.3.4から検索して、シ 5 2023/02/17 23:30
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- SEO 検索エンジン反映遅い 1 2022/06/04 07:35
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- 迷惑メール・スパム gmailの過去のメールを一括削除する方法について 3 2023/04/19 05:27
- その他(ブログ) ブログを始めたいと思うのですが、下記のような場合のおすすめブログサービスを教えてください。 収益化な 4 2023/04/10 10:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCEL、マクロ-改ページ行番号...
-
他のWEBサイトの情報を自動で取...
-
「取得先」という表現について
-
【VBA】EXCELブックを開かずに...
-
VBブラウザに表示されているテ...
-
イベントログ情報の取得順番に...
-
縦型カレンダー
-
format関数について
-
Yahoo! JAPAN IDを新規取得でき...
-
ミュージックのアートワークを...
-
vb6で、特定のフォルダを常時監...
-
Dosブロンプトでtabを出力したい
-
バッチファイルでpingの結果を...
-
$_POST,$_GETの値が空...
-
VBA コレクションに2次元配列...
-
開始と終了を指定して、その間...
-
shシェルスクリプト 空白行の...
-
classの再定義エラーについて
-
PHPでカレンダーを作る(縦書き)
-
switch()文で値の大小比較
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「取得先」という表現について
-
Excel VBA:特定の文字列以降(...
-
EXCEL、マクロ-改ページ行番号...
-
DMMの動画を全件取得したのです...
-
【C#】FindWindowExの使い方を...
-
各クライアントマシンのログイ...
-
(Win32)ファイルパスから物理ド...
-
Yahoo! JAPAN IDを新規取得でき...
-
PHPを使って、別サイトの一部を...
-
ps3で久しぶりにCDの音楽情報取...
-
ローカルのコンピュータ名を取...
-
VBブラウザに表示されているテ...
-
format関数について
-
ミュージックのアートワークを...
-
ドライブ文字からハードウェア...
-
IPアドレスとMACアドレスを取得...
-
VBAでPDFのアクティブページ番...
-
バッチファイルでPCのモデル名...
-
VB or VBScriptでPCの製造番号...
-
iphlpapiのGetAdaptersInfoでNI...
おすすめ情報