`
前提・実現したいこと
Pythonでウェブサイトをプロキシ経由でスクレイピングし、情報を取得するプログラムを作成したいです。
発生している問題・エラーメッセージ
通常のネットワークではうまく動作しています。しかし、プロキシを経由して実行すると、ウェブサイトは表示されるもののhtml構造が読み取れなくなります。
ウエブサイトは手動で操作ができるうえ、開発者ツールで見ても通常のネットワークの要素と相違はありません。
原因として「BeautifulSoup(html,"html.parser")」でオプションの記述等が不足しているのではないかと疑っています。
試したこと
ブラウザが確実に読み込まれてから処理するよう前後に十分な待機を設定してみましたが、結果に相違はありませんでした。
使用している言語・ブラウザ等
python3.6,
Chrome,
Selenium,
luminati(レンタルプロキシ)
該当のソースコード
python
1# coding: utf-8 2import time 3from selenium import webdriver 4from selenium.webdriver.common.keys import Keys 5from selenium.webdriver.chrome.options import Options 6from bs4 import BeautifulSoup 7import random 8import requests 9from threading import Thread 10import pyautogui 11#プロキシ認証 12from selenium.webdriver.common.proxy import Proxy, ProxyType 13from selenium.webdriver.common.proxy import * 14 15#オッズ取得 16#対象URL作成 17url = "https://www.boatrace.jp/owpc/pc/race/odds3t?rno=12&jcd=01&hd=20200814" 18 19# プロキシ設定 20# install luminati (https://luminati.io) proxy manager & run 21PROXY = 'zproxy.lum-superproxy.io:xxxxx' 22 23proxy = Proxy() 24proxy.http_proxy = PROXY 25proxy.ftp_proxy = PROXY 26proxy.sslProxy = PROXY 27proxy.no_proxy = "localhost" # etc... ;) 28proxy.proxy_type = ProxyType.MANUAL 29 30# limunati customer info 31proxy.socksUsername = 'hogehoge' 32proxy.socksPassword = "hogehoge" 33 34capabilities = webdriver.DesiredCapabilities.CHROME 35proxy.add_to_capabilities(capabilities) 36 37#ヘッダレスでページにアクセス 38options = Options() 39# ヘッドレスモードを有効にする(次の行をコメントアウトすると画面が表示される)。 40#ヘッダレスではプロキシ認証を回避できない?ためコメントアウト 41# options.add_argument('--headless') 42# options.add_argument('--disable-gpu') 43# options.add_argument('--user-agent=hogehoge') 44# options.add_argument('--blink-settings=imagesEnabled=false') 45# options.add_argument("--disable-extensions") 46# options.add_argument('--disable-desktop-notifications') 47 48 49# ChromeのWebDriverオブジェクトを作成する。 50driver = webdriver.Chrome("C:\PycharmData\chromedriver.exe", options=options, desired_capabilities=capabilities) 51driver.get(url) 52html = driver.page_source.encode('utf-8') 53 54# ランダム Delay 55time.sleep(random.uniform(10, 12)) 56 57#プロキシ認証入力 58def enter_proxy_auth(proxy_username, proxy_password): 59 pyautogui.typewrite(proxy_username) 60 pyautogui.press('tab') 61 pyautogui.typewrite(proxy_password) 62 pyautogui.press('enter') 63 64Thread(target=enter_proxy_auth, args=(proxy.socksUsername, proxy.socksPassword)).start() 65 66# ランダム Delay 67time.sleep(random.uniform(30, 32)) 68###読込完了を待つ必要ありーーーーーーーーーー 69 70#要素を取得 71soup = BeautifulSoup(html,"html.parser") 72row = soup.find_all(class_="oddsPoint") 73print(soup) 74print(row) 75
出力
python
1 #ソースコードより抜粋 2 #要素を取得 3 soup = BeautifulSoup(html,"html.parser") 4 row = soup.find_all(class_="oddsPoint") 5 print(soup) 6 print(row) 7
python
1 #出力 2 <html><head></head><body></body></html> 3 [] 4
状況が分かりません。
> しかし、プロキシを経由して実行すると、ウェブサイトは表示されるもののhtml構造が読み取れなくなります。 ウエブサイトは手動で操作ができるうえ、開発者ツールで見ても通常のネットワークの要素と相違はありません。
のような、ブラウザ操作は、プログラムを driver.get(url) のところで一旦止めて、その状態で見ているのでしょうか?
それともプログラムと全く無関係に、ブラウザを手動で起動しての話でしょうか?
後者なら有効な情報では無いですので、driver.get(url) のところで一旦止めて、そのときのブラウザ情愛を確認しましょう。
⇒otnさん
前者でございます。
デバック実行でブレイクポイントを設定して確認しました。
デバッガですか。ということは、変数htmlの中身の確認もしていますか?
html={bytes:39}b'<html><head></head><body></body></html>'となっており、soupと同一です。
と言うことは質問にお書きの
> 原因として「BeautifulSoup(html,"html.parser")」でオプションの記述等が不足しているのではないかと疑っています。
では無いですよね。
特殊なサイトなのかと気になったので、やってみましたが、再現しません。正常に取得できる。
認証無しProxyですが。Proxy+Chrome+Seleniumという事だけであれば問題ありません。
他のサイトはどうなのでしょう?
あとはFirefoxでやってみるとか。
ということは認証時に問題が発生しているのでしょうか。
他サイトも同様です。
Firefoxは試みたのですが、firefoxでプロキシ認証を突破する方法が分からず、
ご教示頂けますと幸いです。
> ということは認証時に問題が発生しているのでしょうか。
認証無しProxyなので、認証なしです。認証有りProxyが無いので。
> Firefoxは試みたのですが、firefoxでプロキシ認証を突破する方法が分からず、
ご教示頂けますと幸いです。
ブラウザでの認証が面倒なら、認証無しProxyを作って、認証ありProxyに中継するのでしょうか。
あなたの回答
tips
プレビュー