teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

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

2019/04/08 08:25

投稿

JIN3X
JIN3X

スコア84

title CHANGED
File without changes
body CHANGED
@@ -1,96 +1,59 @@
1
1
  selenium(python)でスクレイピングをしておりますが、IPアドレスで制限がかかるのでProxy経由でやりたいと考えております。
2
+ LinuxのCUI環境のため、ヘッドレスしか使えないのですが、Proxyを設定するとうまく表示されないです。
2
3
 
3
- 下記のサイトを参考proxyをセットしておりますが、どのページをターゲットにしても白紙しか表示されません
4
+ 下記の2点から、ChromeのProxy設定時何か不具合があるのではないかと考えております。
5
+ ① 同プロキシ経由で、requestsであればデータが取得できる。
4
- http://www.inmyzakki.com/entry/2017/08/30/183504
6
+ ② Proxyのオプションを付けなければ、Chromeでデータ取得できる。
5
7
 
6
- 何が問題かご存知でしたら教えていただければ幸いです
8
+ 何が問題かご存知でしたら教えていただければ幸いです
7
9
 
8
- なお、ソースをこちらで変更した点として、chromeをヘッドレスにしたのとchromePath不要なので、消しました。跡は同じソースなのでが、BeautifulSoupはソースコードを取得可能ですが、chromeはうまく動かないです
10
+ なお環境下記とおりです。
11
+ <環境>
12
+ -
9
- 環境は、CentOS Linux release 7.6.1810 (Core)です。
13
+ CentOS Linux release 7.6.1810 (Core)
14
+ -
10
- pythonは3.6です。
15
+ python3.6
11
- <出力>
12
- Nice Proxy: http://167.99.1.61:80
13
- スクレイピング
14
- <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
15
16
 
16
- <ソース>
17
+ ```python
18
+ ################インポート################
17
19
  import requests
18
20
  from bs4 import BeautifulSoup
19
21
  from selenium import webdriver
20
- from time import sleep
21
22
  from selenium.webdriver.chrome.options import Options
22
- import random
23
+ ################インポート################
23
- import re
24
24
 
25
+ # ターゲットURL
25
26
  targetUrl = 'https://www.yahoo.co.jp'
26
- PermissionTime = 5
27
+ # プロキシURL
27
- intervalTime = 600
28
+ Proxy = 'http://167.99.1.61:80'
28
29
 
30
+ ################ requestsでのスクレピング ################
31
+ proxies = {'http': Proxy}
32
+ html = requests.get(targetUrl, proxies=proxies)
29
- proxyUrl = 'http://www.cybersyndrome.net/plr6.html'
33
+ soup = BeautifulSoup(html.content, 'html.parser')
34
+ # ちゃんとスクレイピング出来てるか表示
35
+ print("requestsスクレイピング")
36
+ print(soup)
37
+ ########################################################
30
38
 
31
- def getProxy():
39
+ ################ ヘッドレスchromeでのスクレイピング ################
32
- options = Options()
40
+ options = Options()
41
+ options.add_argument("--proxy-server=" + good_proxy)
33
- options.add_argument('--headless')
42
+ options.add_argument('--headless')
34
- driver = webdriver.Chrome(chrome_options=options)
43
+ driver = webdriver.Chrome(chrome_options=options)
35
- driver.get(proxyUrl)
44
+ driver.get(targetUrl)
36
-
37
- soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
45
+ soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
38
- data = soup.find_all('td', id=re.compile("^n")) #正規表現でIDを取得
39
-
40
- driver.close()
46
+ driver.close()
41
-
42
- proxyList = []
43
- for proxyT in data:
44
- proxyList.append('http://'+proxyT.text)
45
- return proxyList
46
-
47
- def is_bad_proxy(pip):
47
+ # ちゃんとスクレイピング出来てるか表示
48
- try:
49
- options = Options()
50
- options.add_argument("--proxy-server=" + pip)
51
- driver = webdriver.Chrome(chrome_options=options)
52
- driver.set_page_load_timeout(PermissionTime)
53
- driver.get(targetUrl)
54
- driver.close()
55
- except:
56
- driver.close()
57
- print("タイムアウト")
48
+ print("Chromeスクレピング")
58
- return True
59
- return False
60
-
61
- def checkProxy(proxys):
62
- temp = None
63
- for item in proxys:
64
- if is_bad_proxy(item):
65
- print("Bad Proxy:", item)
66
- else:
67
- print("Nice Proxy:", item)
68
- temp = item
69
- break
70
- else:
71
- return None
72
- return temp
73
-
74
- while(True):
75
- proxys = getProxy()
76
- good_proxy = checkProxy(proxys)
77
-
78
- if good_proxy is not None:
79
-
80
- proxies = {'http': good_proxy}
81
- html = requests.get(targetUrl, proxies=proxies)
82
- soup = BeautifulSoup(html.content, 'html.parser')
83
-
84
-
85
-
86
- options = Options()
87
- options.add_argument("--proxy-server=" + good_proxy)
88
- options.add_argument('--headless') #変更点!!!!
89
- driver = webdriver.Chrome(chrome_options=options)
90
- driver.get(targetUrl)
91
- soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
92
- driver.close()
93
- print(soup)
49
+ print(soup)
50
+ #################################################################
94
- else:
51
+ ```
95
- print("条件にマッチするプロキシがありません。")
52
+ ```output
96
- sleep(intervalTime)
53
+ requestsスクレイピング
54
+ :
55
+ ページソース(省略)
56
+ :
57
+ Chromeスクレピング
58
+ <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
59
+ ```

1

ソースを見やすく

2019/04/08 08:25

投稿

JIN3X
JIN3X

スコア84

title CHANGED
File without changes
body CHANGED
@@ -14,7 +14,6 @@
14
14
  <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>
15
15
 
16
16
  <ソース>
17
- ################インポート################
18
17
  import requests
19
18
  from bs4 import BeautifulSoup
20
19
  from selenium import webdriver
@@ -22,59 +21,35 @@
22
21
  from selenium.webdriver.chrome.options import Options
23
22
  import random
24
23
  import re
25
- ################インポート################
26
24
 
27
-
28
-
29
- ################可変値################
30
25
  targetUrl = 'https://www.yahoo.co.jp'
31
26
  PermissionTime = 5
32
27
  intervalTime = 600
33
- ################可変値################
34
28
 
35
-
36
-
37
- ################固定値################
38
- # プロキシサイトのURL
39
29
  proxyUrl = 'http://www.cybersyndrome.net/plr6.html'
40
- ################固定値################
41
30
 
42
-
43
-
44
- ################関数群################
45
- # プロキシのリストをスクレイピングする関数
46
31
  def getProxy():
47
- # seleniumの設定、ヘッダーレスモードとクロームのパスを指定
48
32
  options = Options()
49
33
  options.add_argument('--headless')
50
34
  driver = webdriver.Chrome(chrome_options=options)
51
- # サイトへアクセス
52
35
  driver.get(proxyUrl)
53
36
 
54
- # BeautifulSoupさんにhtmlのソースを見やすくしてもらう
55
37
  soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
56
38
  data = soup.find_all('td', id=re.compile("^n")) #正規表現でIDを取得
57
39
 
58
- # クローム閉じる
59
40
  driver.close()
60
41
 
61
- # プロキシを整形して配列に入れる
62
42
  proxyList = []
63
43
  for proxyT in data:
64
44
  proxyList.append('http://'+proxyT.text)
65
45
  return proxyList
66
46
 
67
- # プロキシの選定関数
68
47
  def is_bad_proxy(pip):
69
48
  try:
70
- # seleniumの設定、プロキシを通してクロームのパスを指定
71
49
  options = Options()
72
50
  options.add_argument("--proxy-server=" + pip)
73
- # options.add_argument('--headless') stackflow曰くヘッダーレスとプロキシは同時で使用できないらしい
74
51
  driver = webdriver.Chrome(chrome_options=options)
75
- # webサイトへのタイムアウト時間を設定。もしこの時間内にアクセスできないならexceptに入る
76
52
  driver.set_page_load_timeout(PermissionTime)
77
- # アクセスして閉じる
78
53
  driver.get(targetUrl)
79
54
  driver.close()
80
55
  except:
@@ -83,7 +58,6 @@
83
58
  return True
84
59
  return False
85
60
 
86
- # プロキシのリストをまわして、いいプロキシを見つける。見つからなかったらNoneを返す
87
61
  def checkProxy(proxys):
88
62
  temp = None
89
63
  for item in proxys:
@@ -96,44 +70,27 @@
96
70
  else:
97
71
  return None
98
72
  return temp
99
- ################関数群################
100
73
 
101
-
102
-
103
- ################メイン################
104
- # 無限ループ
105
74
  while(True):
106
- # プロキシを取得していいプロキシを見つける
107
75
  proxys = getProxy()
108
76
  good_proxy = checkProxy(proxys)
109
77
 
110
- # いいプロキシがあったら処理する
111
78
  if good_proxy is not None:
112
79
 
113
- ################スクレイピングする処理(javascriptない場合)################
114
80
  proxies = {'http': good_proxy}
115
81
  html = requests.get(targetUrl, proxies=proxies)
116
82
  soup = BeautifulSoup(html.content, 'html.parser')
117
- # ちゃんとスクレイピング出来てるか表示
118
- # print(soup)
119
- ################スクレイピングする処理(javascriptない場合)################
120
83
 
121
84
 
122
85
 
123
- ################スクレイピングする処理(javascriptある場合################
124
86
  options = Options()
125
87
  options.add_argument("--proxy-server=" + good_proxy)
126
88
  options.add_argument('--headless') #変更点!!!!
127
- # options.add_argument('--headless') stackflow曰くヘッダーレスとプロキシは同時で使用できないらしい
128
89
  driver = webdriver.Chrome(chrome_options=options)
129
90
  driver.get(targetUrl)
130
91
  soup = BeautifulSoup(driver.page_source.encode('utf-8'), 'html.parser')
131
92
  driver.close()
132
- # ちゃんとスクレイピング出来てるか表示
133
93
  print(soup)
134
- ################スクレイピングする処理(javascriptある場合)################
135
-
136
94
  else:
137
95
  print("条件にマッチするプロキシがありません。")
138
- sleep(intervalTime)
96
+ sleep(intervalTime)
139
- ################メイン################