2013-03-26 19 views
7

Numero:
Impossibile comprendere completamente il raschiatore Web Goutte.Come utilizzare Goutte

Richiesta:
Qualcuno può aiutarmi a capire o fornire il codice per aiutarmi a capire meglio come utilizzare Goutte il raschietto web? Ho letto il README.md. Sto cercando più informazioni di ciò che fornisce quali opzioni sono disponibili in Goutte e come scrivere quelle opzioni o quando stai cercando i form cerchi il nome = o l'id = del modulo?

Webpage layout di tentare di essere raschiato:
Fase 1:
La pagina web ha una forma ha un pulsante di opzione per scegliere che tipo di modulo da compilare (ad esempio nome o licenza.). È impostato su Nome con caselle di testo Nome e Cognome insieme a un elenco di selezione del menu a discesa Stato. Se scegli Radio, c'è jQuery o JavaScript che fa scomparire le caselle di testo Nome e Cognome e viene visualizzata una casella di testo della licenza.

Fase 2:
Una volta inviato con successo la forma allora ti porta ad una pagina che ha più link. Possiamo entrare in uno dei due per ottenere le informazioni di cui abbiamo bisogno.

Fase 3:
Una volta che abbiamo cliccato con successo sul link che vogliamo la terza pagina ha i dati che stiamo cercando e vogliamo memorizzare i dati in una variabile PHP.

Invio Informazione errata:
Se le informazioni sbagliate è presentata poi una jQuery/Javascript restituisce un messaggio di "No records sono stati trovati." sulla stessa pagina dell'invio.

Nota:
Il metodo preferito sarebbe quella di selezionare il pulsante di opzione di licenza, inserire il numero di licenza, selezionare lo stato e poi inviare il modulo. Ho letto un sacco di post e blog e altri articoli su Goutte e da nessuna parte posso trovare quali opzioni sono disponibili per Goutte, come scoprire queste informazioni o come utilizzare queste informazioni se esistono.

+0

Forse questa domanda ha la necessità di essere più preciso? Al momento è molto generale e così difficile da rispondere. Se il problema è che JavaScript non è in esecuzione in Goutte, allora sarebbe corretto - avresti bisogno di eseguire un browser appropriato per quello. Il webkit senza testa lo farebbe per te. – halfer

risposta

13

La documentazione che si desidera guardare è il Symfony2 DomCrawler.

Goutte è un accumulo cliente in cima Guzzle che restituisce Crawlers ogni volta che si richiede/presentare qualcosa:

use Goutte\Client; 
$client = new Client(); 
$crawler = $client->request('GET', 'http://www.symfony-project.org/'); 

Con questo crawler si possono fare cose come ottenere tutti i tag P all'interno del corpo:

$nodeValues = $crawler->filter('body > p')->each(function (Crawler $node, $i) { 
    return $node->text(); 
}); 
print_r($nodeValues); 

compilare e inviare moduli:

$form = $crawler->selectButton('sign in')->form(); 
$crawler = $client->submit($form, array(
     'username' => 'username', 
     'password' => 'xxxxxx' 
)); 

Un metodo selectButton() è disponibile sul crawler che restituisce un altro crawler che corrisponde a un pulsante (input [type = submit], input [type = image] o un pulsante) con il testo specificato. [1]

Si fa clic sul link o opzioni impostate, selezionare caselle di controllo e di più, vedi Form and Link support.

Per ottenere i dati dal crawler utilizzano le html o text metodi

echo $crawler->html(); 
echo $crawler->text(); 
0

Dopo molte prove ed errori, ho scoperto che esiste un supporto molto più semplice, ben documentato, migliore (se necessario) e molto più efficace di goutte. Se si hanno problemi con Goutte provare quanto segue:

  1. semplice HTML DOM: http://simplehtmldom.sourceforge.net/

Se siete nella stessa situazione come mi è stato in cui la pagina che si sta tentando di raschiare richiede un referrer da il proprio sito Web, quindi è possibile utilizzare una combinazione di CURL e DOM HTML semplice perché non sembra che Simple HTML DOM abbia la possibilità di inviare un referrer. Se non hai bisogno di un referrer, puoi usare Simple HTML DOM per raschiare la pagina.

$url="http://www.example.com/sub-page-needs-referer/"; 
$referer="http://www.example.com/"; 
$html=new simple_html_dom(); // Create a new object for SIMPLE HTML DOM 
/** cURL Initialization **/ 
$ch = curl_init($url); 

/** Set the cURL options **/ 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_REFERER,$referer); 
$output = curl_exec($ch); 

if($output === FALSE) { 
    echo "cURL Error: ".curl_error($ch); // do something here if we couldn't scrape the page 
} 
else { 
    $info = curl_getinfo($ch); 
    echo "Took ".$info['total_time']." seconds for url: ".$info['url']; 
    $html->load($output); // Transfer CURL to SIMPLE HTML DOM 
} 

/** Free up cURL **/ 
curl_close($ch); 

// Do something with SIMPLE HTML DOM. It is well documented and very easy to use. They have a lot of examples. 
+2

Goutte sta cercando di fare un po 'più di questo, da quello che posso dire: fare clic sui collegamenti, seguire i reindirizzamenti, inviare moduli e così via - essenzialmente emulare un browser. – halfer

+0

Grazie. Tuttavia, non è la capacità di Goutte a essere messa in discussione. È mancanza di documentazione su come usarlo correttamente. Ho provato, provato e provato a usarlo e non riuscivo a capirlo. Semplice HTML DOM è stato un gioco da ragazzi. Dopo il fallimento dopo l'insuccesso e la ricerca di aiuto che non è mai arrivato su Goutte, non avevo nemmeno bisogno di chiedere aiuto su Simple HTML DOM e avevo solo bisogno di leggere una piccola parte della documentazione per capirlo. – scrfix

+0

Ho solo fatto un po 'di Goette, quindi è difficile per me dire se i documenti sono buoni a questo punto. Stai usando un IDE di completamento automatico, fuori interesse? In caso contrario, renderà la tua vita molto più semplice - mi aspetto che sarebbe stato molto più difficile se non fosse stato per Netbeans. – halfer