web-dev-qa-db-fra.com

PhantomJS renvoyant une page Web vide (python, Selenium)

Essayer de supprimer un site Web sans avoir à lancer une instance de navigateur dans un script python (avec Selenium). Je peux le faire avec Chrome ou Firefox - je l’ai essayé et cela fonctionne - mais je veux utiliser PhantomJS afin que ce soit sans tête.

Le code ressemble à ceci:

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()

La sortie est simplement:

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

Mais lorsque j'utilise les options Chrome ou Firefox, cela fonctionne bien. Je pensais que le site Web renvoyait du courrier indésirable en fonction de l'agent utilisateur, alors j'ai essayé de le simuler. Aucune différence.

Qu'est-ce que je rate?

MISE À JOUR: Je vais essayer de garder l'extrait ci-dessous mis à jour jusqu'à ce que cela fonctionne. Ce qui est en dessous est ce que je suis en train d'essayer.

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

Je faisais face au même problème et aucune quantité de code pour faire attendre le chauffeur ne m'aidait.
Le problème est le cryptage SSL sur les sites Web https, les ignorer fera l'affaire.

Appelez le pilote PhantomJS en tant que:

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

Cela a résolu le problème pour moi.

29
Raunaq Kochar

Vous devez attendez que la page soit ouverte d. Cela se fait généralement en utilisant un Explicit Wait to wait pour qu'un élément clé soit présent ou visible sur une page. Par exemple:

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
# ...

Ici, nous attendrons jusqu'à 10 secondes qu'un élément div avec class="content" devienne visible avant d'obtenir le code source de la page.


De plus, vous devrez peut-être ignorer les erreurs SSL:

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

Cependant, je suis à peu près sûr que cela est lié aux problèmes de redirection dans PhantomJS. Il existe un ticket ouvert dans phantomjs bugtracker:

3
alecxe

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

Cela a fonctionné pour moi

0
Arjun Lal