6

現在、cURL を使用して、Web サイト スクレーパーのリダイレクトから URL を取得しようとしています。私はウェブサイトからのURLだけが必要です。過去数日間、stackoverflow や他のサイトを調査しましたが、うまくいきませんでした。私が現在使用しているコードは、このWebサイトからのものです。

  $url = "http://www.someredirect.com";
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1');         
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
  curl_setopt($ch, CURLOPT_NOBODY, true);
  $response = curl_exec($ch);
  preg_match_all('/^Location:(.*)$/mi', $response, $matches);
  curl_close($ch);
  echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found';

どんな助けでも大歓迎です!

4

2 に答える 2

9

特定のケースでは、サーバーは特定のユーザーエージェント文字列をチェックしています。

サーバーがユーザー エージェント文字列をチェックする302とき、サーバーが「有効な」(サーバーによると) ユーザー エージェントを確認した場合にのみ、リダイレクト ステータス コードで応答します。「無効な」ユーザー エージェントは、302リダイレクト ステータス コードの応答またはLocation:ヘッダーを受け取りません。

特定のケースでは、サーバーが「無効な」ユーザーエージェントからリクエストを受信すると200、レスポンスボディにテキストのない OK ステータスコードで応答します。

(: 以下のコードでは、提供されている実際の URL は例に置き換えられています。)

http://www.example.comのサーバーが User-Agent 文字列をチェックし、 にhttp://www.example.com/product/123/リダイレクトするとしますhttp://www.example.org/abc

PHP では、ソリューションは次のようになります。

<?php

$url = 'http://www.example.com/product/123/';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0"); // Necessary. The server checks for a valid User-Agent.
curl_exec($ch);

$response = curl_exec($ch);
preg_match_all('/^Location:(.*)$/mi', $response, $matches);
curl_close($ch);

echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found';

そして、このスクリプトの出力は次のようになりますhttp://www.example.org/abc

于 2013-06-10T15:14:09.690 に答える