2009-10-29 9 views
8

Sto cercando una libreria PHP che mi permetta di scartare pagine web e si occupa di tutti i cookie e di precompilare i moduli con i valori predefiniti, questo è quello che mi infastidisce di più.Libreria di scraping per PHP - phpQuery?

Sono stanco di dover abbinare ogni singolo elemento di input con xpath e mi piacerebbe se esistesse qualcosa di meglio. Mi sono imbattuto in phpQuery ma il manuale non è molto chiaro e non riesco a scoprire come effettuare richieste POST.

Qualcuno può aiutarmi? Grazie.

@ Jonathan Fingland:

Nell'esempio fornito dal manuale per browserGet() abbiamo:

require_once('phpQuery/phpQuery.php'); 

phpQuery::browserGet('http://google.com/', 'success1'); 

function success1($browser) 
{ 
    $browser->WebBrowser('success2') 
    ->find('input[name=q]')->val('search phrase') 
    ->parents('form') 
    ->submit(); 
} 

function success2($browser) 
{ 
    echo $browser; 
} 

suppongo tutti gli altri campi vengono demoliti e inviare nella richiesta GET , Voglio fare lo stesso con il metodo phpQuery :: browserPost() ma non so come farlo. Il modulo che sto cercando di racchiudere ha un token di input e mi piacerebbe che phpQuery potesse essere abbastanza intelligente da raschiare il token e lasciarmi semplicemente cambiare gli altri campi (in questo caso username e password), inviando tramite POST tutto.

PS: Trovare questo è non sta per essere utilizzato per spamming.

+2

+1 non hanno una risposta ma non vedo l'ora altri commenti – Andrew

+0

Se il manuale non è chiaro, puoi provare a leggere il codice sorgente –

+1

La vita è piuttosto dura per gli spammer in questi giorni. –

risposta

2

Vedi http://code.google.com/p/phpquery/wiki/Ajax ed in particolare:

phpQuery::post($url, $data, $callback, $type)

e

# data Object, String che definisce il parametro di dati come un oggetto o su una stringa. POST richiede dovrebbe essere possibile utilizzando il formato stringa di query, ad esempio:

$data = "username=Jon&password=123456"; 
$url = "http://www.mysite.com/login.php"; 
phpQuery::post($url, $data, $callback, $type) 

come phpQuery è una porta jQuery la firma del metodo è lo stesso (i documenti collegano direttamente al sito di jQuery - http://docs.jquery.com/Ajax/jQuery.post)

Modifica

Due cose:

C'è anche una funzione di phpQuery::browserPost che potrebbe incontrare il vostro n meglio

Tuttavia, si noti, inoltre, che la richiamata success2 viene chiamato solo sulle submit() or click() metodi in modo da poter riempire tutti i campi del modulo prima di questo.

ad es.

require_once('phpQuery/phpQuery.php'); 
phpQuery::browserGet('http://www.mysite.com/login.php', 'success1'); 
function success1($browser) { 
    $handle = $browser 
    ->WebBrowser('success2'); 
    $handle 
    ->find('input[name=username]') 
     ->val('Jon'); 
    $handle 
    ->find('input[name=password]') 
     ->val('123456'); 
     ->parents('form') 
     ->submit(); 
} 
function success2($browser) { 
    print $browser; 
} 

(Si noti che questo non è stato testato, ma dovrebbe lavoro)

+0

Si prega di controllare il mio aggiornamento. –

0

Vorrei utilizzare una libreria dedicata per l'analisi dei file HTML e una libreria dedicata per l'elaborazione delle richieste HTTP. Usare la stessa libreria per entrambi sembra una cattiva idea, IMO.

Per l'elaborazione delle richieste HTTP, consultare ad es. Httpful, Unirest, Requests o Guzzle. Guzzle è particolarmente popolare in questi giorni, ma alla fine, qualunque libreria funzioni meglio per te è ancora una questione di gusto personale.

Per analizzare i file HTML, consiglierei una libreria che ho scritto io: DOM-Query. Ti consente di (1) caricare un file HTML e quindi (2) selezionare o modificare parti del tuo codice HTML allo stesso modo in cui lo faresti se usassi jQuery in un'app di frontend.