0

Webからデータを取得し、 cURLとSimple HTMLDomPHPクラスを使用してユーザーに表示しようとしています。

一部のページはクライアントの言語に応じてリダイレクトされます。私は関数を使用して、スクレイピングされる最終ページを決定しています。

ユーザーが見るようにそれを表示するために、私はこれを使用しています:

$useragent = $_SERVER['HTTP_USER_AGENT'];
curl_setopt($ch, CURLOPT_USERAGENT,  $useragent);

現在、私の現在のユーザーのほとんどはスペイン語を話します。そのため、受け入れられる言語を一時的に制限しているため、ターゲットページに言語リダイレクトがある場合は、最初にスペイン語または英語が表示されます。

$header[] = "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3";

ただし、私のサーバーはオランダにあり、一部のページにはIPベースのリダイレクタがあるため、言語パラメータを無視して、ページが/nl/ディレクトリにリダイレクトされることがあります。

これは、たとえば、www.econsultancy.comWebサイトで発生します。

cURLリクエストでクライアントのIPアドレスを使用して、この種のリダイレクトを回避することは可能ですか?

また、クライアントのブラウザ言語設定を使用して、Accept-Languageパラメータを動的にすることは可能ですか?

関数スクリプト全体は次のとおりです。

<?
function redirector($originalurl) {

$ch = curl_init();

$useragent = $_SERVER['HTTP_USER_AGENT'];

    $header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3";
    $header[] = "Pragma: ";

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_USERAGENT,  $useragent); 
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_setopt($ch, CURLOPT_URL, $originalurl);
    $out = curl_exec($ch);

    $out = str_replace("\r", "", $out);

    $headers_end = strpos($out, "\n\n");
    if( $headers_end !== false ) { 
        $out = substr($out, 0, $headers_end);
    }   

    $headers = explode("\n", $out);
    foreach($headers as $header) {
        if( substr($header, 0, 10) == "Location: " ) { 
            $target = substr($header, 10);

            $targeturl = $target;
        }   
    }

return $targeturl;
}
?>

前もって感謝します!

4

1 に答える 1

1

一部のIPベースのリダイレクトは非常に頑固です(そして、特定のページを<あなたの言語と思われるページ>から英語に切り替えることはほとんど不可能です)が、 CURLOPT_FOLLOWLOCATIONset toFalseとparsingheaderを使用してリダイレクトを傍受しようとする可能性がLocationあります(このソリューションでは、 URLを正しく推測するため):

$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if( $status_code >= 300 && $status_code < 400){
    // Was redirect, parse header
    if( substr( $location, '/nl/') !== false){
         // Try to load page $url = str_replace( $location, '/nl/', '/en/');
         // Remember to check whether page exists
    } else {
         // Continue request
    }
}

編集-サイトごと

これを「サイトごと」に(言語を切り替えるために各サイトの関数を作成するために)行う余裕がある場合は、言語を切り替えるときに何が起こっているかを追跡できます(たとえば、Firefoxにはこれに最適なプラグインがあります)。使用することになります:

  • ハードコア(ユーザーは言語についてこれまで何も制御できません)-あなたは困惑しています
  • さまざまなURL(すでに説明しました)-URLに、、、、...が表示/nl/lang=nll=nlます
  • 言語はCookie内に保存されます-Cookieを一度設定するだけで[チュートリアル]、それから正しくなります
  • 登録ユーザーは言語を変更できます。各サイトでユーザーを作成し、その言語を<必要なもの>に切り替えてから、(ページを開くときに)最初にページへのログインをシミュレートする必要があります(Cookieを使用してログインフォームを開く)およびPOSTユーザー名とパスワード)

少し運が良ければ、次のようなCookie値のペアの「大規模な配列」の組み合わせですでに持っているものでうまくいくでしょう。

array (
    'lang' => 'eng',
    'l' => 'en',
    'Language' => 'Engligh',
    ...
)

しかし、同じ「Cookie変数名」と異なる値を使用する2つのページに遭遇すると、次のようになります。

lang=eng
lang=en
lang=7

あなたはめちゃくちゃになっていて、switch($domain)もう一度何らかのものを使わなければならないでしょう。

于 2012-11-14T22:04:39.967 に答える