質問編集履歴

5

イメージの追加

2017/06/25 04:02

投稿

curi
curi

スコア10

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,10 @@
7
7
  ・A列にあるキーワード10000個の検索結果上位3つのURLを、それぞれB列〜D列に取得
8
8
 
9
9
  ・EncodeURLを使わずに行う(excel2010でEncodeURLを使えないため)
10
+
11
+ ![イメージ説明](06653081a55c088d9f56b877101a348d.jpeg)
12
+
13
+
10
14
 
11
15
 
12
16
 

4

指摘いただいた点の加筆

2017/06/25 04:01

投稿

curi
curi

スコア10

test CHANGED
@@ -1 +1 @@
1
- VBAでEncodeURLを使えない時の代替コード
1
+ EncodeURLを使わずYahoo検索結果URLをスクレイピングする代替コード(Excel2010使用)
test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ・A列にあるキーワード10000個の検索結果上位3つのURLを、それぞれB列〜D列に取得
8
8
 
9
- ・EncodeURLを使わずに行う
9
+ ・EncodeURLを使わずに行う(excel2010でEncodeURLを使えないため)
10
10
 
11
11
 
12
12
 

3

コードのアップデート

2017/06/25 03:59

投稿

curi
curi

スコア10

test CHANGED
@@ -1 +1 @@
1
- VBAでyahoo検索結果TOP3のURLを取得(スクレイピング)
1
+ VBAでEncodeURLを使えない時の代替コード
test CHANGED
@@ -1,139 +1,77 @@
1
1
  こんにちは。
2
-
3
- 下記の方法を模索しています。よろしくお願いします。
4
2
 
5
3
 
6
4
 
7
5
  ###実現したいこと
8
6
 
9
- ExcelのA1:A10000にあるキーワードを
7
+ ・Aにあるキーワード10000個の検索結果上位3つのURL、それぞれB列〜D列に取得
10
8
 
11
- yahooで検索し
9
+ EncodeURLを使わずに行う
12
10
 
13
- ・検索結果の上位3つのURLを
14
11
 
15
- ・1行ごとに、B列〜D列に取得
16
12
 
17
- という作業をVBAで行いたいです。
13
+ ###該当のソースコード
18
14
 
19
- ![イメージ説明](46b389eae10f2d64c97932174cc9450b.jpeg)
20
15
 
16
+
17
+ ```ここに言語を入力
18
+
19
+ Sub main()
20
+
21
- (キーワードはサンプルで実際のものとは異なります。)
21
+ Dim objIE As InternetExplorer
22
+
23
+ Set objIE = CreateObject("InternetExplorer.Application")
24
+
25
+ Dim i As Long
26
+
27
+ Dim l As Integer
22
28
 
23
29
 
24
30
 
25
31
 
26
32
 
27
- ###前提条件
28
-
29
- ・検索結果が3つ未満になることは起こり得ない
30
-
31
- ・検索結果の上部に出てくる広告リンクは省いた上位3つを取得
32
-
33
- ・検索結果の上部に、広告以外の邪魔者リンク(※)は出てこないキーワード群である
34
-
35
- (※画像検索・ニュース検索・まとめ一覧などの検索結果リンク)
36
-
37
- ・URLは、ハイパーリンクでもプレーンテキストでも構わない
38
-
39
- ・URLは、日本語リンクでもhtml表記でも構わない
40
-
41
- ・http://の文字列は、あってもなくても構わない
33
+ For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
42
-
43
- ・DoEventsは使わない
44
34
 
45
35
 
46
36
 
47
- ###該当のソースコード
48
-
49
- yahooで検索結果を表示させるところまでしか書けていません。
37
+ objIE.navigate "https://search.yahoo.co.jp/search?p=" & Replace(Application.EncodeURL(Range("A" & i)), "%20", "+")
50
38
 
51
39
 
52
40
 
53
- ```ここに言語を入力
41
+ Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
54
42
 
55
- Sub Macro1()
43
+ DoEvents
44
+
45
+ Loop
56
46
 
57
47
 
58
48
 
59
- n = Cells(Rows.Count, "A").End(xlUp).Row
60
-
61
- For i = 2 To n
49
+ For l = 0 To 2
62
-
63
- Range("A" & i).Select
64
-
65
- a = ActiveCell.Value
66
-
67
- Call Yahoo検索(a)
68
-
69
- Next i
70
-
71
- End Sub
72
50
 
73
51
 
74
52
 
75
- Sub Yahoo検索(keyWD)
53
+ Range("B" & i).Offset(, l) = objIE.document.getElementById("WS2m").getElementsByClassName("w")(l).getElementsByTagName("a")(0).href
76
54
 
77
- Set objIE = CreateObject("InternetExplorer.Application")
78
55
 
79
- strURL = "http://www.yahoo.co.jp/"
80
56
 
81
- With objIE
57
+ Next l
82
58
 
83
- .Visible = True
59
+ Next i
84
60
 
85
- .Navigate2 strURL
86
61
 
87
- Do While .Busy = True
88
62
 
89
- DoEvents
63
+ objIE.Quit
90
64
 
91
- Loop
65
+ Set objIE = Nothing
92
66
 
93
- Do While .document.ReadyState <> "complete"
94
67
 
95
- DoEvents
96
-
97
- Loop
98
-
99
- .document.getElementById("srchtxt").Value = keyWD
100
-
101
- .document.forms(0).Submit
102
-
103
- End With
104
68
 
105
69
  End Sub
106
70
 
107
71
  ```
108
72
 
109
- ている箇所は2点
73
+ 難しければスプレッドシートのIMPORTXMLで対応しようかと思ますが
110
74
 
111
- 1)検索結果一覧ページから上位3つのURLを取得するコードの書き方
112
-
113
- 2)作業負荷調整(n秒待つ・同時作業はn個で)
75
+ 処理速度が遅いでExcelでできればと思いす。
114
-
115
- です。
116
-
117
-
118
-
119
-
120
-
121
- ###補足
122
-
123
- ・getelement?を使う
124
-
125
- ・広告の除外はid指定で可能(広告はid="So1"、検索結果はid="WS2m")
126
-
127
- ・InnerTextをチェックし「キャッシュ」という文字を含むものを除外する必要あり
128
-
129
- という点まで辿り着きましたが、コードにどう書けば良いのかで躓いています。
130
-
131
-
132
-
133
- 手作業で3日間やってきたのですが400件/日が限界でした。
134
-
135
- 1ヶ月で1万件は気が遠くなる作業のため、VBAを勉強しはじめ試行錯誤中です。
136
-
137
-
138
76
 
139
77
  よろしくお願いします。

2

誤字を直しました。

2017/06/25 03:42

投稿

curi
curi

スコア10

test CHANGED
File without changes
test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  (※画像検索・ニュース検索・まとめ一覧などの検索結果リンク)
36
36
 
37
- ・URLは、ハイパーリンクでもテキストリンクでも構わない
37
+ ・URLは、ハイパーリンクでもプレーンテキストでも構わない
38
38
 
39
39
  ・URLは、日本語リンクでもhtml表記でも構わない
40
40
 

1

自分で調べたことを追記します。

2017/06/23 03:23

投稿

curi
curi

スコア10

test CHANGED
File without changes
test CHANGED
@@ -120,57 +120,13 @@
120
120
 
121
121
  ###補足
122
122
 
123
- 位置調べたところ、URLを取得できそな場所を2箇所見つけました。
123
+ ・getelement?使
124
124
 
125
+ ・広告の除外はid指定で可能(広告はid="So1"、検索結果はid="WS2m")
125
126
 
127
+ ・InnerTextをチェックし「キャッシュ」という文字を含むものを除外する必要あり
126
128
 
127
- 取得候補1)下記グリン文字部分
128
-
129
- ![イメージ説明](7a1f63f0f400a40ae2d344c633cf5240.jpeg)
130
-
131
- ```ここに言語を入力
132
-
133
- <span class="u">giftmall.co.jp/fathersday/</span>
134
-
135
- ```
136
-
137
-
138
-
139
- ーーー
140
-
141
- 取得候補2)下記ブルー文字の部分
142
-
143
- ![イメージ説明](6d9927e65750bc385cba669b240febcd.jpeg)
144
-
145
- ```ここに言語を入力
146
-
147
- <a href="http://search.yahoo.co.jp/r/FOR=vCt3T.xV3ig02GVFcOO75T07yxQPCZ.54dgh4CoZ7jSFMtoM1DL9LuO6tWAtzk.vR4mXvWKBBibMMNq1fjMQYo0uGBj.8SHYV9Fw6C5AEzuqh6bf2a7yyCdDaW2BKorsLV_QZn8QCF16xIb1kF1aSwqzEo1lwJ8Aqj3KDRRaQTWVTDdqajFo.WyEyltI7bOvPNDwnTLdNcaFnrJPA_C3Chr1UhtG/_ylt=A2RCDSuxc0xZEHUAR5WDTwx.;_ylu=X3oDMTEybzU5ajRmBHBvcwM3BHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDA1OTI-/SIG=11ojqqnbg/EXP=1498283377/**http%3A//www.e87.com/selection/father/" onmousedown="return lswap(this,'http%3A//www.e87.com/selection/father/','FOR=vCt3T.xV3ig02GVFcOO75T07yxQPCZ.54dgh4CoZ7jSFMtoM1DL9LuO6tWAtzk.vR4mXvWKBBibMMNq1fjMQYo0uGBj.8SHYV9Fw6C5AEzuqh6bf2a7yyCdDaW2BKorsLV_QZn8QCF16xIb1kF1aSwqzEo1lwJ8Aqj3KDRRaQTWVTDdqajFo.WyEyltI7bOvPNDwnTLdNcaFnrJPA_C3Chr1UhtG/','A2RCDSuxc0xZEHUAR5WDTwx.','X3oDMTEybzU5ajRmBHBvcwM3BHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDA1OTI-','11ojqqnbg','1498283377')">【遅れてゴメンね】<b>父の日プレゼント</b>・ギフト特集2017|イイハナ</a>
148
-
149
- ```
150
-
151
- (↑onmousedown="return lswap(this,'〜のあと)
152
-
153
-
154
-
155
- ーーー
156
-
157
- ※回避したい広告リスティングには
158
-
159
- <div class="a cf"><span class="u"><span class="ad">
160
-
161
- が使われていました。
162
-
163
- ```
164
-
165
- <div class="a cf"><span class="u"><span class="ad">広告</span>pet.benesse.ne.jp/</span></div>
166
-
167
- ```
168
-
169
-
170
-
171
-
172
-
173
- 取得するURLは、置換で対応できるものであれば不完全でも構いません。
129
+ という点まで辿り着きましたが、コドにどう書けば良いかで躓いています。
174
130
 
175
131
 
176
132