2014-02-26 107 views
3

我想抓取一個網站使用PHP,CURL和POST方法,以便在網頁抓取頁面之前提交表單。我遇到的問題是使用POST方法連接:沒有數據提交給服務器,所以刮過的網頁不包含我在找的東西。CURL + POST + multipart/form-data

我不能確定問題與表單類型相關:enctype =「multipart/form-data」。 考慮到表單是multipart/form-data,我該如何管理這個POST請求? 我必須以特殊的方式編碼post_string嗎?

下面是我使用的代碼:

function curl($url) { 

//POST string 
$post_string="XXXX"; 

$options = Array(
     CURLOPT_RETURNTRANSFER => TRUE, 
     CURLOPT_FOLLOWLOCATION => TRUE, 
     CURLOPT_AUTOREFERER => TRUE, 
     CURLOPT_CONNECTTIMEOUT => 120, 
     CURLOPT_TIMEOUT => 120, 
     CURLOPT_MAXREDIRS => 10, 
     CURLOPT_USERAGENT => "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8", 
     CURLOPT_URL => $url, 
     CURLOPT_CAINFO => dirname(__FILE__)."/cacert.pem", 

     CURLOPT_POSTFIELDS => $post_string, 

    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, $options); 
    $data = curl_exec($ch); 
    curl_error($ch); 
    curl_close($ch);  
    return $data; 
} 

$scraped_page = curl("XXXURLXXX");  
echo $scraped_page; 

謝謝!

回答

4

設置CURLOPT_POST爲true:

CURLOPT_POST = true 

然後填寫您的文章場這樣的 '菜單':

$postfields = array(); 
$postfields['field1'] = 'value1'; 
$postfields['field2'] = 'value2'; 
CURLOPT_POSTFIELDS => $postfields 

如果值是一個數組,將Content-Type標題將被設置爲multipart/form-data。

The PHP manual

+0

好, 我添加了這些行: CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => http_build_query($ postfields), 和充滿了你安裝後場,但它仍然不能正常工作:螢火蟲確認沒有執行POST ... – user3352382

+1

Firebug不會顯示真正的POST,因爲這發生在PHP執行的「內部」,而不是在頁面的「輸出」內部。 在$ data = curl_exec($ ch)後添加以下內容到您的PHP中: ==> var_dump(curl_getinfo($ ch)); 然後看看會顯示什麼。 – KoalaBear

+0

嗯,好的,謝謝,但是「回聲」的頁面仍然顯示空格,沒有結果。 – user3352382

1

是,$ post_string必須是一個數組。

還將CURLOPT_POST設置爲true。