2

ある種のページパーサー(より具体的には、ページ上のいくつかの単語を強調表示する)を作成しようとしていますが、問題が発生しています。curlを使用してURLからページ全体のデータを取得していますが、ほとんどのページはうまく連携していますが、他のページは連携していません。

私の目標は、ブラウザが取得しているのと同じようにすべてのページのhtmlを取得することであり、ブラウザのように匿名で使用しようとしています。つまり、興味のないブラウザのデータを表示するためにログインが必要なページがある場合です。問題は、FirefoxやChromeから通常送信されるようにすべてのヘッダーを設定しても、通常のブラウザから匿名でアクセスできるTwitterやFacebookのページにアクセスできないことです。

ブラウザーをエミュレートしてこれらの側からページを取得する方法はありますか、またはOAuthを使用する必要があります(ブラウザーがそれを使用する必要がない理由を誰かが説明できますか)?

編集 私は解決策を得ました!誰かが問題を抱えている場合は、次のようにする必要があります
。->プロトコルをhttpsからhttpに切り替えてみてください->
URLに/#!/要素がある場合は削除
してください->私のcurl要素 "Accept-Encoding:gzip、 deflate」も問題を引き起こしていました。理由はわかりませんが、今ではすべて問題ありません。

私のコード:

if (substr($this->url,0,5) == 'https')
        $this->url = str_replace('https://', 'http://', $this->url);

    $this->url = str_replace('/#!/', '/', $this->url);

    //check, if a valid url is provided
    if(!filter_var($this->url, FILTER_VALIDATE_URL))
        return false;

    $curl = curl_init();

    $header = array();
    $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";
    // -> gives an error: $header[] = "Accept-Encoding: gzip, deflate";
    $header[] = "Accept-Language: pl,en-us;q=0.7,en;q=0.3";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Pragma: "; // browsers keep this blank. 
    curl_setopt($curl, CURLOPT_HTTPHEADER,$header);
    curl_setopt($curl, CURLOPT_HEADER, false);

    curl_setopt($curl, CURLOPT_URL, $this->url);

    curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($curl, CURLOPT_COOKIESESSION,true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)');
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

    $response = curl_exec($curl);
    curl_close($curl);

    if ($response) return $response;

    return false;

すべてがクラスに含まれていましたが、コードを非常に簡単に抽出できます。私にとっては、両方(twitterとfacebook)がうまく機能しています。

4

2 に答える 2

3

はい、これはブラウザをエミュレートすることは可能です。ただし、ブラウザから送信されるすべてのhttpヘッダー(Cookieを含む)を注意深く監視し、リダイレクトも処理する必要があります。この一部はcUrl関数によって「自動化」でき、残りは手動で処理する必要があります。

注:コード内のHTMLヘッダーについては話していません。これらは、ブラウザによって送受信されるHTTPヘッダーです。

これらを見つける最も簡単な方法は、ユーザーフィドラーでトラフィックを監視することです。URLを選択し、右側で「要素の検査」を探します。送信されるヘッダーと受信されるヘッダーが表示されます。

Facebookは、iFrameのミラッドでこれをより複雑にしているので、より単純なWebサイトから始めることをお勧めします。

于 2012-12-17T10:52:49.990 に答える
0

私は解決策を得ました!誰かが問題を抱えている場合は、次のようにする必要があります
。->プロトコルをhttpsからhttpに切り替えてみてください->
URLに/#!/要素がある場合は削除
してください->私のcurl要素 "Accept-Encoding:gzip、 deflate」も問題を引き起こしていました。理由はわかりませんが、今ではすべて問題ありません。

私のコード:

if (substr($this->url,0,5) == 'https')
        $this->url = str_replace('https://', 'http://', $this->url);

    $this->url = str_replace('/#!/', '/', $this->url);

    //check, if a valid url is provided
    if(!filter_var($this->url, FILTER_VALIDATE_URL))
        return false;

    $curl = curl_init();

    $header = array();
    $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";
    // -> gives an error: $header[] = "Accept-Encoding: gzip, deflate";
    $header[] = "Accept-Language: pl,en-us;q=0.7,en;q=0.3";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Pragma: "; // browsers keep this blank. 
    curl_setopt($curl, CURLOPT_HTTPHEADER,$header);
    curl_setopt($curl, CURLOPT_HEADER, false);

    curl_setopt($curl, CURLOPT_URL, $this->url);

    curl_setopt($curl, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($curl, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($curl, CURLOPT_COOKIESESSION,true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7 (.NET CLR 3.5.30729)');
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

    $response = curl_exec($curl);
    curl_close($curl);

    if ($response) return $response;

    return false;

すべてがクラスに含まれていましたが、コードを非常に簡単に抽出できます。私にとっては、両方(twitterとfacebook)がうまく機能しています。

于 2012-12-20T10:40:14.803 に答える