PhantomJS возвращает пустую веб-страницу (python, Selenium)
Попытка экрана очистить веб-сайт без необходимости запуска фактического экземпляра браузера в python script (используя Selenium). Я могу сделать это с помощью 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, он отлично работает. Я подумал, что, возможно, веб-сайт возвращал мусор на основе пользовательского агента, поэтому я попытался подделать это. Нет разницы.
Что мне не хватает?
ОБНОВЛЕНО: я попытаюсь сохранить обновленный сниппет, пока он не сработает. Что ниже, это то, что я сейчас пытаюсь сделать.
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.
Ответы
Ответ 1
Я столкнулся с одной и той же проблемой, и никакое количество кода, чтобы заставить водителя ждать, помогло.
Проблема заключается в шифровании SSL на веб-сайтах https, игнорируя их, будет делать трюк.
Вызвать драйвер PhantomJS следующим образом:
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])
Это решило проблему для меня.
Ответ 2
Вам нужно дождаться загрузки страницы. Обычно это делается с помощью 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
# ...
Здесь мы подождем до 10 секунд, чтобы элемент div
с class="content"
стал видимым до получения источника страницы.
Кроме того, вам может потребоваться игнорировать ошибки SSL:
browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true'])
Хотя, я уверен, что это связано с проблемами перенаправления в PhantomJS
. Существует открытый билет в PhantomJS
bugtracker: