2016-08-04 21 views
0

Es gibt ein PHP-Formular, das eine umfangreiche Datenbank abfragt. Die URL für das Formular lautet https://db.slickbox.net/venues.php. Es dauert bis zu 10 Minuten nach dem Senden des Formulars, dass die Ergebnisse zurückgegeben werden, und die Ergebnisse werden inline auf derselben Seite zurückgegeben. Ich habe versucht, Requests, URLLib2, LXML und Selenium zu verwenden, aber ich kann keine Lösung mit einer dieser Bibliotheken finden. Kennt jemand eine Möglichkeit, die Seitenquelle der Ergebnisse nach dem Senden dieses Formulars abzurufen?Wie reichen Sie ein PHP-Formular ein, das Ergebnisse nicht sofort mit Python zurückgibt?

Wenn Ihnen eine Lösung dafür bekannt ist, füllen Sie einfach das Namensfeld ("vname") mit dem Namen eines beliebigen Geschäfts/einer Tankstelle aus. Letztendlich muss ich auch die Checkboxen mit dem Attribut "checked" setzen, aber das ist ein weiteres Ziel, nachdem ich das funktioniert habe. Vielen Dank!

+0

Haben Sie versucht, die Zeitüberschreitung Ihrer Anfrage zu ändern? – Dekel

+0

Im Fall der Requests-Bibliothek funktioniert das Timeout trotzdem nicht. Das legt die maximale Zeit fest, die gewartet wird, bevor eine Ausnahme zurückgegeben wird. Das Problem besteht darin, dass der Code mit einer dieser Bibliotheken ausgeführt wird und sofort ein Ergebnis liefert, was nicht der Fall sein sollte. – DaJoNel

Antwort

0

Normalerweise verlasse ich mich auf Curl, um so etwas zu tun. Anstatt das Formular mit der Schaltfläche zum Abrufen der Quelle zu senden, rufen Sie direkt die Antwortseite auf (geben Sie Ihre Anfrage). Da ich unter PHP arbeite, ist es ziemlich einfach, dies zu tun. Mit Python benötigen Sie pycURL, um dasselbe zu verwalten.

Das einzige, was zu tun ist, ist locations.php mit den guten Argumente Werte aufgerufen mit POST method with Curl aufgerufen.

Auf diese Weise müssen Sie Ihre Anfrage vorbereiten (Ländercode, Katzenname), aber Sie müssen weder die Checkbox noch die Webseite in Ihrem Browser laden.

set_ini(max_execution_time,1200) // wait 20 minutes before quitting 
$ch = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "https://db.slickbox.net/venues.php"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

// prepare arguments for the form 
$data = array('adlock ' => 1, 'age' => 0,'country' => 145,'imgcnt'=>0, 'lock'=>0,'regex'=>1,'submit'=>'Search','vname'=>'test'); 

//add arguments to our request 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
//launch request 
if(! $result = curl_exec($ch)) 
{ 
    trigger_error(curl_error($ch)); 
} 
echo $result; 
+0

Mir geht es gut, nur mit PHP dafür, wie ich es in die Web-Schnittstelle, die ich verwenden möchte, sowieso zu bauen. Ich kenne Curl allerdings nicht sehr gut. Kannst du mir ein konkreteres Beispiel für Code geben, den ich verwenden würde? Wenn nicht, ist das in Ordnung, und morgen kann ich mehr darüber recherchieren. Wird es Curl nicht interessieren, dass es 10 Minuten auf eine Antwort warten muss? Danke für den Tipp! – DaJoNel

+0

Ungeprüfter Beispielcode hinzugefügt. Über Zeitlimit kann curl durch php max Ausführungszeit begrenzt werden. Wir können es nur für unser Skript mit ini_set Funktion ändern. – technico

+0

Das hat funktioniert; vielen Dank! Ich habe PHP immer geschätzt und das festigt weiter, wie großartig es ist. Ich werde definitiv auch in PycURL schauen (einfachere Automatisierung mit Python für meine Zwecke), aber das ist ein guter Anfang! – DaJoNel

0

Wie wäre es mit ghost?

from ghost import Ghost 
ghost = Ghost() 

with ghost.start() as session: 
    page, extra_resources = session.open("https://db.slickbox.net/venues.php", wait_onload_event=True) 
    ghost.set_field_value("input[name=vname]", "....") 
    # Any other values 
    page.fire_on('form', 'submit') 
    page, resources = ghost.wait_for_page_loaded() 

    content = session.content # or page.content I forgot which 

Nachdem Sie verwenden können beautifulsoup die HTML zu analysieren oder Geist einige rudimentäre Dienstprogramme haben, das zu tun.