2

これが私のコードです:

function get_data($url)
{
$ch = curl_init();
$timeout = 15;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, random_user_agent());
$data = curl_exec($ch);
curl_close($ch);
return $data;
}

//Grab HTML
$urllist = fopen("links.txt", "r+");
for ($j = 0; $j <= 50; $j++)
{
$post = rtrim(fgets($urllist));
echo $post;
$html = get_data($post);
echo $html;

問題 : 使用するget_data("http://url.com")と、html で適切なデータが得られます。しかし、変数を使用して URL を渡すと、$html何も返されません。

$post は、私がチェックした正しい URL を保持しています。正しい使い方じゃないですかget_data($post);

カール情報は次のとおりです。

私はこれを得る:

array(20) { 
["url"]=> string(68) "http://secret-url.com" 
["content_type"]=> string(9) "text/html" 
["http_code"]=> int(301) 
["header_size"]=> int(255) 
["request_size"]=> int(340) 
["filetime"]=> int(-1) 
["ssl_verify_result"]=> int(0) 
["redirect_count"]=> int(0) 
["total_time"]=> float(0.095589) 
["namelookup_time"]=> float(0.012224) 
["connect_time"]=> float(0.049399) 
["pretransfer_time"]=> float(6.5E-5) 
["size_upload"]=> float(0) 
["size_download"]=> float(0) 
["speed_download"]=> float(0) 
["speed_upload"]=> float(0) 
["download_content_length"]=> float(0) 
["upload_content_length"]=> float(0) 
["starttransfer_time"]=> float(0.095534) 
["redirect_time"]=> float(0) 
}
4

2 に答える 2

2

このコードを試してください。

function get_data($url)
{
    $ch = curl_init();
    $timeout = 15;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_USERAGENT, random_user_agent());

    // Edit: Follow redirects
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    $data = curl_exec($ch);
    var_dump(curl_getinfo($ch));
    curl_close($ch);
    return $data;
}

//Grab HTML
$urllist = fopen("links.txt", "r+");
for ($j = 0; $j <= 50; $j++)
{
    if($post = rtrim(fgets($urllist)))
    {
        echo $post;
        echo get_data($post);
    }
    else
    {
        echo "No URL provided!";
    }

    echo "\n<hr>\n";
}
于 2012-05-02T19:11:05.983 に答える
0

$html = file_get_contents($url);十分でしょうか?記録が示すように、それはしませんでした=)

正当な答えとの会話を要約するために編集します。

カールをFOLLOWLOCATIONディレクティブを含む次のように変更し、オプションでMAXREDIRSを使用してカールを制約します

function get_data($url) {
    $ch = curl_init();
    $timeout = 15;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // follow Location: newurl.tld - i.e. HTTP 30X status codes
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    // give up follow location if circular after 5 tries
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_USERAGENT, random_user_agent());
    $data = curl_exec($ch);
    // if in doubt, whats going on, look through info of curl_getinfo($ch);
    // var_dump(curl_getinfo($ch));
    curl_close($ch);
    return $data;
}
//Grab HTML
$urllist = fopen("links.txt", "r+");
for ($j = 0; $j <= 50; $j++) {
    $post = rtrim(fgets($urllist));
    echo $post;
    $html = get_data($post);
    echo $html;
}

必要に応じて、これを2回以上行っているように見えるので、links.txtページに戻って(Cookieコンテナを設定します。これにより、訪問者は以前にそこにいたことを知ることができます)、その情報を連続して再利用します。

// filehandle, writeable by httpd user:
$cookie_file = "/tmp/cookie/cookie1.txt";
// set request to parse cookies and send them with corresponding host requests
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
// set response cookies to be saved
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
于 2012-05-02T18:44:36.400 に答える