【问题标题】:Retrieve content of another website检索另一个网站的内容
【发布时间】:2013-03-29 14:48:23
【问题描述】:

我想获取另一个页面的内容。背景是我想发出 AJAX 请求,但由于 Same Origin Policy 我不能这样做。现在我想编写一个自己的 PHP 脚本,在该脚本上发出 AJAX 请求。 URL 如下所示:

http://domain.com/subfolder/another_subfolder/index.php?id=1234&tx_manager_pi9[parameter]=1&tx_manager_pi9[category]=test&tx_manager_pi9[action]=getInfos&tx_manager_pi9[controller]=Finder&cHash=123456789001233455332

我用fopencurlfile_get_contents 进行了尝试。作品中没有任何东西。问题是如果我将 URL 作为字符串输入,例如

$results = file_get_contents('http://domain.com/subfolder/another_subfolder/index.php?id=1234&tx_manager_pi9[parameter]=1&tx_manager_pi9[category]=test&tx_manager_pi9[action]=getInfos&tx_manager_pi9[controller]=Finder&cHash=123456789001233455332');

确实有效。如果我输入一个变量

$url = 'http://domain.com/subfolder/another_subfolder/index.php?id=1234&tx_manager_pi9[parameter]=1&tx_manager_pi9[category]=test&tx_manager_pi9[action]=getInfos&tx_manager_pi9[controller]=Finder&cHash=123456789001233455332';
$results = file_get_contents($url);

我来错页了。使用特定参数,我得到一个结果。如果参数没有正确给出,我似乎来到了一个默认页面。我无法理解它。

curl 也一样:

$curlSession = curl_init();
$options = array
(
    CURLOPT_URL=>$url,
    CURLOPT_HEADER=>false,
    CURLOPT_RETURNTRANSFER=>true,
    CURLOPT_FOLLOWLOCATION=>true
);
curl_setopt_array($curlSession,$options);
$results = curl_exec($curlSession);

这不起作用。如果我将 URL 作为字符串而不是变量输入,我会得到一些结果!我认为与符号& 或方括号[] 是问题,但我不能这么说。 & 应保留,[] 不是正确的 URL 参数。但是为什么直接输入有效而不是变量呢?

我使用该变量是因为我用str_replace 进行了一些替换,使查询更加灵活。

我在这里看到了类似的问题(cURL function not workingcurl_setopt doesnt work with url as a variable),但从未发布过真正的解决方案。

【问题讨论】:

  • 分配给变量的文字字符串的工作方式相同;问题一定出在其他地方...
  • 您是否在 cURL 请求中设置了用户代理?
  • 但是在哪里呢?一个简单的file_get_contents 就证明了这个问题。如果我先回显 URL 并在浏览器中打开 URL,它就可以工作。 file_get_contents 不行。

标签: php curl fopen file-get-contents


【解决方案1】:

您的第二个代码块中有 , 而不是 ;

【讨论】:

  • 感谢 Aram,但这不是问题。
  • 嗯...这会给你一个服务器错误页面。
【解决方案2】:

您是否需要“登录”到您正在访问的网站?这可以解释为什么它在您的浏览器中运行,而不是通过您的服务器脚本。

如果其他一切都相同,您的浏览器和您列出的 PHP 函数应该返回相同的结果。

您能否提供实际的 URL 供我们测试?

编辑:根据您提供的网址,它对我来说工作正常:

php > $test = file_get_contents("http://www.domain.com/user/user_neu/index.php?id=16518&tx_stusermanager_pi9%5Bindications%5D=1&tx_stusermanager_pi9%5Bcategory%5D=cure&tx_stusermanager_pi9%5Baction%5D=getHousesByIndications&tx_stusermanager_pi9%5Bcontroller%5D=HouseFinder&cHash=88230660f01ads34d73a199b82e976");
php > var_dump($test);
string(29) "16,15,14,13,12,11,17,19,22"

【讨论】:

  • 我不确定您是如何生成该 URL 的,但它似乎不正确。你有“&”在 URL 中,它是与号 (&) 的 HTML 编码。 &只能在您的实际 HTML 中使用以生成 &。在您的 URL 中包含它会破坏它。相反,您想单独使用实际的 & 符号。
  • 我认为问题在于 URL 是 URL 编码的。在这个编码的 URL 上执行 str_replace 会导致错误的结果(即使是稍后的解码也无济于事)。使用“未编码”的 URL 将导致所需的结果。感谢您的帮助!
  • 是的,我知道它是 URL 编码的,这就是我所暗示的;)我很高兴我的暗示已经足够了,其余的你自己解决了!
【解决方案3】:

我的问题是我使用了一个编码的 URL 作为起点。例如

http://domain.com/subfolder/another_subfolder/index.php?id=1234&tx_manager_pi9%5Bparameter%5D=%23%23%23param1%23%23%23&tx_manager_pi9%5Bcategory%5D=%23%23%23param2%23%23%23&tx_manager_pi9%5Baction%5D=getInfos&tx_manager_pi9%5Bcontroller%5D=Finder&cHash=123456789001233455332

我在 URL 编码的字符串上创建了 str_replace。即使之后使用urldecode,也没有为curlfile_get_contents、...生成正确的URL。

正确的 URL 应该是这样的

http://domain.com/subfolder/another_subfolder/index.php?id=1234&tx_manager_pi9[参数]=###param1###&tx_manager_pi9[类别]=###param2###&&tx_manager_pi9[动作]= getInfos&tx_manager_pi9[controller]=Finder&&cHash=123456789001233455332

即没有&%23%5B%5D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    相关资源
    最近更新 更多