質問編集履歴

2

問題の要点を抽出・見やすく

2019/04/08 08:25

投稿

JIN3X
JIN3X

スコア84

test CHANGED
File without changes
test CHANGED
@@ -1,34 +1,38 @@
1
1
  selenium(python)でスクレイピングをしておりますが、IPアドレスで制限がかかるのでProxy経由でやりたいと考えております。
2
+
3
+ LinuxのCUI環境のため、ヘッドレスしか使えないのですが、Proxyを設定するとうまく表示されないです。
2
4
 
3
5
 
4
6
 
5
- 下記のサイトを参考にproxyをセットしておりますが、どのページをターゲットにしても白紙しか表示されません
7
+ 下記の2点から、ChromeのProxy設定時に何か不具合があるのではないかと考えております。
6
8
 
9
+ ① 同プロキシ経由で、requestsであればデータが取得できる。
10
+
7
- http://www.inmyzakki.com/entry/2017/08/30/183504
11
+ ② Proxyのオプションを付けなければ、Chromeでデータ取得できる。
8
12
 
9
13
 
10
14
 
11
- 何が問題かご存知でしたら教えていただければ幸いです
15
+ 何が問題かご存知でしたら教えていただければ幸いです
12
16
 
13
17
 
14
18
 
15
- なお、ソースをこちらで変更した点として、chromeをヘッドレスにしたのとchromePathは不要なの、消しました。跡は同じソースなのでが、BeautifulSoupはソースコードを取得可能ですが、chromeはうまく動かないです
19
+ なお環境は下記のとおりです。
16
20
 
17
- 環境は、CentOS Linux release 7.6.1810 (Core)です。
21
+ <環境>
18
22
 
19
- pythonは3.6です。
23
+ -
20
24
 
21
- <出力>
25
+ CentOS Linux release 7.6.1810 (Core)
22
26
 
23
- Nice Proxy: http://167.99.1.61:80
27
+ -
24
28
 
25
- スクレイピング
29
+ python3.6
26
-
27
- <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
28
30
 
29
31
 
30
32
 
31
- <ソース>
33
+ ```python
34
+
35
+ ################インポート################
32
36
 
33
37
  import requests
34
38
 
@@ -36,156 +40,78 @@
36
40
 
37
41
  from selenium import webdriver
38
42
 
39
- from time import sleep
40
-
41
43
  from selenium.webdriver.chrome.options import Options
42
44
 
43
- import random
45
+ ################インポート################
44
-
45
- import re
46
46
 
47
47
 
48
48
 
49
+ # ターゲットURL
50
+
49
51
  targetUrl = 'https://www.yahoo.co.jp'
50
52
 
51
- PermissionTime = 5
53
+ # プロキシURL
52
54
 
53
- intervalTime = 600
55
+ Proxy = 'http://167.99.1.61:80'
54
56
 
55
57
 
56
58
 
59
+ ################ requestsでのスクレピング ################
60
+
61
+ proxies = {'http': Proxy}
62
+
63
+ html = requests.get(targetUrl, proxies=proxies)
64
+
57
- proxyUrl = 'http://www.cybersyndrome.net/plr6.html'
65
+ soup = BeautifulSoup(html.content, 'html.parser')
66
+
67
+ # ちゃんとスクレイピング出来てるか表示
68
+
69
+ print("requestsスクレイピング")
70
+
71
+ print(soup)
72
+
73
+ ########################################################
58
74
 
59
75
 
60
76
 
61
- def getProxy():
77
+ ################ ヘッドレスchromeでのスクレイピング ################
62
78
 
63
- options = Options()
79
+ options = Options()
64
80
 
65
- options.add_argument('--headless')
81
+ options.add_argument("--proxy-server=" + good_proxy)
66
82
 
67
- driver = webdriver.Chrome(chrome_options=options)
83
+ options.add_argument('--headless')
68
84
 
69
- driver.get(proxyUrl)
85
+ driver = webdriver.Chrome(chrome_options=options)
70
86
 
87
+ driver.get(targetUrl)
71
88
 
89
+ soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
72
90
 
73
- soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
91
+ driver.close()
74
92
 
75
- data = soup.find_all('td', id=re.compile("^n")) #正規現でIDを取得
93
+ # ちゃんとスクレイピング出来てるか
76
94
 
95
+ print("Chromeスクレピング")
77
96
 
97
+ print(soup)
78
98
 
79
- driver.close()
99
+ #################################################################
80
100
 
101
+ ```
81
102
 
103
+ ```output
82
104
 
83
- proxyList = []
105
+ requestsスクレイピング
84
106
 
85
- for proxyT in data:
107
+ :
86
108
 
87
- proxyList.append('http://'+proxyT.text)
109
+ ページソース(省略)
88
110
 
89
- return proxyList
111
+ :
90
112
 
113
+ Chromeスクレピング
91
114
 
115
+ <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
92
116
 
93
- def is_bad_proxy(pip):
94
-
95
- try:
117
+ ```
96
-
97
- options = Options()
98
-
99
- options.add_argument("--proxy-server=" + pip)
100
-
101
- driver = webdriver.Chrome(chrome_options=options)
102
-
103
- driver.set_page_load_timeout(PermissionTime)
104
-
105
- driver.get(targetUrl)
106
-
107
- driver.close()
108
-
109
- except:
110
-
111
- driver.close()
112
-
113
- print("タイムアウト")
114
-
115
- return True
116
-
117
- return False
118
-
119
-
120
-
121
- def checkProxy(proxys):
122
-
123
- temp = None
124
-
125
- for item in proxys:
126
-
127
- if is_bad_proxy(item):
128
-
129
- print("Bad Proxy:", item)
130
-
131
- else:
132
-
133
- print("Nice Proxy:", item)
134
-
135
- temp = item
136
-
137
- break
138
-
139
- else:
140
-
141
- return None
142
-
143
- return temp
144
-
145
-
146
-
147
- while(True):
148
-
149
- proxys = getProxy()
150
-
151
- good_proxy = checkProxy(proxys)
152
-
153
-
154
-
155
- if good_proxy is not None:
156
-
157
-
158
-
159
- proxies = {'http': good_proxy}
160
-
161
- html = requests.get(targetUrl, proxies=proxies)
162
-
163
- soup = BeautifulSoup(html.content, 'html.parser')
164
-
165
-
166
-
167
-
168
-
169
-
170
-
171
- options = Options()
172
-
173
- options.add_argument("--proxy-server=" + good_proxy)
174
-
175
- options.add_argument('--headless') #変更点!!!!
176
-
177
- driver = webdriver.Chrome(chrome_options=options)
178
-
179
- driver.get(targetUrl)
180
-
181
- soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
182
-
183
- driver.close()
184
-
185
- print(soup)
186
-
187
- else:
188
-
189
- print("条件にマッチするプロキシがありません。")
190
-
191
- sleep(intervalTime)

1

ソースを見やすく

2019/04/08 08:25

投稿

JIN3X
JIN3X

スコア84

test CHANGED
File without changes
test CHANGED
@@ -30,8 +30,6 @@
30
30
 
31
31
  <ソース>
32
32
 
33
- ################インポート################
34
-
35
33
  import requests
36
34
 
37
35
  from bs4 import BeautifulSoup
@@ -46,15 +44,7 @@
46
44
 
47
45
  import re
48
46
 
49
- ################インポート################
50
47
 
51
-
52
-
53
-
54
-
55
-
56
-
57
- ################可変値################
58
48
 
59
49
  targetUrl = 'https://www.yahoo.co.jp'
60
50
 
@@ -62,35 +52,13 @@
62
52
 
63
53
  intervalTime = 600
64
54
 
55
+
56
+
65
- ################可変値################
57
+ proxyUrl = 'http://www.cybersyndrome.net/plr6.html'
66
58
 
67
59
 
68
60
 
69
-
70
-
71
-
72
-
73
- ################固定値################
74
-
75
- # プロキシサイトのURL
76
-
77
- proxyUrl = 'http://www.cybersyndrome.net/plr6.html'
78
-
79
- ################固定値################
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
- ################関数群################
88
-
89
- # プロキシのリストをスクレイピングする関数
90
-
91
61
  def getProxy():
92
-
93
- # seleniumの設定、ヘッダーレスモードとクロームのパスを指定
94
62
 
95
63
  options = Options()
96
64
 
@@ -98,13 +66,9 @@
98
66
 
99
67
  driver = webdriver.Chrome(chrome_options=options)
100
68
 
101
- # サイトへアクセス
102
-
103
69
  driver.get(proxyUrl)
104
70
 
105
71
 
106
-
107
- # BeautifulSoupさんにhtmlのソースを見やすくしてもらう
108
72
 
109
73
  soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
110
74
 
@@ -112,13 +76,9 @@
112
76
 
113
77
 
114
78
 
115
- # クローム閉じる
116
-
117
79
  driver.close()
118
80
 
119
81
 
120
-
121
- # プロキシを整形して配列に入れる
122
82
 
123
83
  proxyList = []
124
84
 
@@ -130,27 +90,17 @@
130
90
 
131
91
 
132
92
 
133
- # プロキシの選定関数
134
-
135
93
  def is_bad_proxy(pip):
136
94
 
137
95
  try:
138
-
139
- # seleniumの設定、プロキシを通してクロームのパスを指定
140
96
 
141
97
  options = Options()
142
98
 
143
99
  options.add_argument("--proxy-server=" + pip)
144
100
 
145
- # options.add_argument('--headless') stackflow曰くヘッダーレスとプロキシは同時で使用できないらしい
146
-
147
101
  driver = webdriver.Chrome(chrome_options=options)
148
102
 
149
- # webサイトへのタイムアウト時間を設定。もしこの時間内にアクセスできないならexceptに入る
150
-
151
103
  driver.set_page_load_timeout(PermissionTime)
152
-
153
- # アクセスして閉じる
154
104
 
155
105
  driver.get(targetUrl)
156
106
 
@@ -167,8 +117,6 @@
167
117
  return False
168
118
 
169
119
 
170
-
171
- # プロキシのリストをまわして、いいプロキシを見つける。見つからなかったらNoneを返す
172
120
 
173
121
  def checkProxy(proxys):
174
122
 
@@ -194,7 +142,25 @@
194
142
 
195
143
  return temp
196
144
 
145
+
146
+
147
+ while(True):
148
+
149
+ proxys = getProxy()
150
+
151
+ good_proxy = checkProxy(proxys)
152
+
153
+
154
+
155
+ if good_proxy is not None:
156
+
157
+
158
+
197
- ################関数群################
159
+ proxies = {'http': good_proxy}
160
+
161
+ html = requests.get(targetUrl, proxies=proxies)
162
+
163
+ soup = BeautifulSoup(html.content, 'html.parser')
198
164
 
199
165
 
200
166
 
@@ -202,55 +168,11 @@
202
168
 
203
169
 
204
170
 
205
- ################メイン################
206
-
207
- # 無限ループ
208
-
209
- while(True):
210
-
211
- # プロキシを取得していいプロキシを見つける
212
-
213
- proxys = getProxy()
214
-
215
- good_proxy = checkProxy(proxys)
216
-
217
-
218
-
219
- # いいプロキシがあったら処理する
220
-
221
- if good_proxy is not None:
222
-
223
-
224
-
225
- ################スクレイピングする処理(javascriptない場合)################
226
-
227
- proxies = {'http': good_proxy}
228
-
229
- html = requests.get(targetUrl, proxies=proxies)
230
-
231
- soup = BeautifulSoup(html.content, 'html.parser')
232
-
233
- # ちゃんとスクレイピング出来てるか表示
234
-
235
- # print(soup)
236
-
237
- ################スクレイピングする処理(javascriptない場合)################
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
- ################スクレイピングする処理(javascriptある場合################
246
-
247
171
  options = Options()
248
172
 
249
173
  options.add_argument("--proxy-server=" + good_proxy)
250
174
 
251
175
  options.add_argument('--headless') #変更点!!!!
252
-
253
- # options.add_argument('--headless') stackflow曰くヘッダーレスとプロキシは同時で使用できないらしい
254
176
 
255
177
  driver = webdriver.Chrome(chrome_options=options)
256
178
 
@@ -260,18 +182,10 @@
260
182
 
261
183
  driver.close()
262
184
 
263
- # ちゃんとスクレイピング出来てるか表示
264
-
265
185
  print(soup)
266
-
267
- ################スクレイピングする処理(javascriptある場合)################
268
-
269
-
270
186
 
271
187
  else:
272
188
 
273
189
  print("条件にマッチするプロキシがありません。")
274
190
 
275
191
  sleep(intervalTime)
276
-
277
- ################メイン################