2016-07-20 19 views
0

Ich versuche, ein Suchformular mit Curl (über PHP) zu kratzen. Ich dachte, alles sei richtig oder nah, aber das scheint nicht der Fall zu sein. Um ein wenig Hintergrundwissen zu erhalten, versuche ich Daten aus einem Suchformular zu sammeln (oder zu scrappen), in das der Benutzer einen Datumsbereich einfügt und dann die Suche einreicht. Die Ergebnisse werden dann unter den Sucheingaben angezeigt. Die Seite verwendet AJAX/JavaScript, um Daten zu laden.Sammeln von Daten von einer Website, die Ajax/Javascript verwendet. - CURL

Wenn ich das PHP-Skript ausführen, bekomme ich nichts zurück. Ich habe print_r hinzugefügt, um die Ergebnisse zu sehen, aber nichts zeigt.

Hier ist mein Skript. Alle Ratschläge sind willkommen.

<?php 
    class Scraper { 

     // Class constructor method 
     function __construct() { 
      $this->useragent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'; 
      $handle = fopen('cookie.txt', 'w') or exit('Unable to create or open cookie.txt file.'."\n"); // Opening or creating cookie file 
      fclose($handle); // Closing cookie file 
      $this->cookie = 'cookie.txt'; // Setting a cookie file to store cookie 
      $this->timeout = 30; // Setting connection timeout in seconds 
     } 

     // Method to search and scrape search details 
     public function scrapePersons($searchString = '') { 

      $searchUrl = 'https://virre.prh.fi/novus/publishedEntriesSearch'; 

      $postValues = array(
       'businessId' => '', 
       'startDate' => '07072016', 
       'endDate' => '08072016', 
       'registrationTypeCode' => 'kltu.U', 
       '_todayRegistered' => 'on', 
       'domicileCode' => '091', 
       '_domicileCode' => '1', 
       '_eventId_search' => 'Search', 
       'execution' => 'e2s1', 
       '_defaultEventId' => '', 
      ); 

      $search = $this->curlPostFields($searchUrl, $postValues); 

      return $search; 
     } 

     // Method to make a POST request using form fields 
     public function curlPostFields($postUrl, $postValues) { 
      $_ch = curl_init(); // Initialising cURL session 

      // Setting cURL options 
      curl_setopt($_ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Prevent cURL from verifying SSL certificate 
      curl_setopt($_ch, CURLOPT_FAILONERROR, TRUE); // Script should fail silently on error 
      curl_setopt($_ch, CURLOPT_COOKIESESSION, TRUE); // Use cookies 
      curl_setopt($_ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow Location: headers 
      curl_setopt($_ch, CURLOPT_RETURNTRANSFER, TRUE); // Returning transfer as a string 
      curl_setopt($_ch, CURLOPT_COOKIEFILE, $this->cookie); // Setting cookiefile 
      curl_setopt($_ch, CURLOPT_COOKIEJAR, $this->cookie); // Setting cookiejar 
      curl_setopt($_ch, CURLOPT_USERAGENT, $this->useragent); // Setting useragent 
      curl_setopt($_ch, CURLOPT_URL, $postUrl); // Setting URL to POST to 
      curl_setopt($_ch, CURLOPT_CONNECTTIMEOUT, $this->timeout); // Connection timeout 
      curl_setopt($_ch, CURLOPT_TIMEOUT, $this->timeout); // Request timeout 
      curl_setopt($_ch, CURLOPT_POST, TRUE); // Setting method as POST 
      curl_setopt($_ch, CURLOPT_POSTFIELDS, $postValues); // Setting POST fields (array) 

      $results = curl_exec($_ch); // Executing cURL session 
      curl_close($_ch); // Closing cURL session 

      return $results; 
     } 

     // Class destructor method 
     function __destruct() { 
      // Empty 
     } 
    } 

    $testScrape = new Scraper(); // Instantiating new object 

    $data = json_decode($testScrape->scrapePersons()); // Scraping people records 
    print_r($data); 
?> 

Antwort

1

Zuerst würde ich überprüfen, um sicherzustellen, dass Sie dies tun dürfen.

Angenommen, Sie erhalten ein Sicherheits-Überprüfungsformular, das, wenn Sie einen Browser verwenden, aufgrund der Übermittlung des Javascript-Onload-Formulars automatisch gesendet wird, müssen Sie dies replizieren, damit es funktioniert.

Der Ausgang, den ich bekomme, ist wie folgt.

<html> 
<head> 
    <title>Security Check</title></head> 
<body onLoad="document.security_check_form.submit()"> 
<form name="security_check_form" action="j_security_check" method="POST"> 
<input type="hidden" value="prhanonymous" name="j_username"/> 
<input type="hidden" value="*=AQICr82J28VvM2ljVarKvWv3LuibH7WPDyc8EVKuXdfytXrEv/o/MzMP3KfIEq+1Wda1ICP/pDLJQqniyBaRXTXnJGJCJhi2gVIoM0e+rwGEczxoah2+PsKOEnSI6A9j2MQO6/Q4i/vaXHVA7gfjjH7qvz0Fc+Pr7fPiBtJt+2YF3YghUN39cFhoK2O8mjRwTKORojRwcguq74B8Ttd0xyUlYld68t/mplsWv5npwMfT/wfv2XMidoVmB5k/p2rp3XbwlnHpJI3gJJcb5VV58M7frCB0vricZYv3xrKuco6qpMlX9wJeCqrhrMotY0+lisAvmEDIR3YpobE=" name="j_password"/> 
</form> 
</body> 
</html> 
+0

Vielen Dank für Ihre Antwort! Sie erwähnten das Kopieren des obigen Codes. Meinst du das Hinzufügen des Codes in das PHP-Skript oder etwas anderes? Verzeihen Sie, dass ich dumm bin. Mein Gehirn ist gebraten. – MangoPie

+0

Sie müssen die Sicherheitsprüfung auch in cURL implementieren. Sie müssen also die Aktion (die sich nicht ändern sollte), den j_username, und j_password und POST erhalten. Am Ende werden Sie 2 POST-Anfragen machen, 1, die Sie jetzt haben, um die Suche zu machen, und eine 2, um über die Sicherheitsprüfung zu kommen. – pmcilwaine