web-dev-qa-db-ja.com

PhantomJSが空のWebページを返す(Python、Selenium)

pythonスクリプト(Seleniumを使用)で実際のブラウザーインスタンスを起動する必要なしに、Webサイトをスクリーンスクレイピングしようとしています。これは、ChromeまたはFirefoxで実行できます。 -試してみましたが、動作しますが、PhantomJSを使用して、ヘッドレスにします。

コードは次のようになります。

import sys
import traceback
import time

from Selenium import webdriver
from Selenium.webdriver.common.keys import Keys
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 "
    "(KHTML, like Gecko) Chrome/15.0.87"
)

try:
    # Choose our browser
    browser = webdriver.PhantomJS(desired_capabilities=dcap)
    #browser = webdriver.PhantomJS()
    #browser = webdriver.Firefox()
    #browser = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")

    # Go to the login page
    browser.get("https://www.whatever.com")

    # For debug, see what we got back
    html_source = browser.page_source
    with open('out.html', 'w') as f:
        f.write(html_source)

    # PROCESS THE PAGE (code removed)

except Exception, e:
    browser.save_screenshot('screenshot.png')
    traceback.print_exc(file=sys.stdout)

finally:
    browser.close()

出力は次のとおりです。

<html><head></head><body></body></html>

しかし、ChromeまたはFirefoxオプションを使用すると、問題なく動作します。Webサイトがユーザーエージェントに基づいてジャンクを返しているのではないかと思ったので、偽ってみました。違いはありません。

何が欠けていますか?

更新:機能するまで、以下のスニペットを更新していきます。以下は私が現在試みているものです。

import sys
import traceback
import time
import re

from Selenium import webdriver
from Selenium.webdriver.support.wait import WebDriverWait
from Selenium.webdriver.common.by import By
from Selenium.webdriver.common.keys import Keys
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from Selenium.webdriver.support import expected_conditions as EC

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 (KHTML, like Gecko) Chrome/15.0.87")

try:
    # Set up our browser
    browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true'])
    #browser = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")

    # Go to the login page
    print "getting web page..."
    browser.get("https://www.website.com")

    # Need to wait for the page to load
    timeout = 10
    print "waiting %s seconds..." % timeout
    wait = WebDriverWait(browser, timeout)
    element = wait.until(EC.element_to_be_clickable((By.ID,'the_id')))
    print "done waiting. Response:"

    # Rest of code snipped. Fails as "wait" above.
18
cbp2

私は同じ問題に直面しており、ドライバーを待機させるコードの量は役に立ちませんでした。
問題は、httpsウェブサイトのSSL暗号化であり、それらを無視するとうまくいきます。

PhantomJSドライバーを次のように呼び出します。

driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])

これで問題は解決しました。

29
Raunaq Kochar

ページがloaするのを待つ dする必要があります。通常、これは Explicit Wait からを使用して行われ、ページにキー要素が存在するか表示されるまで待機します。例えば:

from Selenium.webdriver.support.wait import WebDriverWait
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support import expected_conditions as EC


# ...
browser.get("https://www.whatever.com")

wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.content")))

html_source = browser.page_source
# ...

ここでは、ページのソースを取得する前にclass="content"を含むdiv要素が表示されるまで最大10秒待機します。


さらに、SSLエラーを無視する

browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true'])

ただし、これはPhantomJSのリダイレクトの問題に関連していると確信しています。 phantomjsバグトラッカーに未解決のチケットがあります:

3
alecxe

driver = webdriver.PhantomJS(service_args = ['-ignore-ssl-errors = true'、 '--ssl-protocol = TLSv1'])

これは私のために働いた

0
Arjun Lal