【问题标题】:How to fix curl request return weird error PHP?如何修复 curl 请求返回奇怪的错误 PHP?
【发布时间】:2021-04-21 19:40:12
【问题描述】:

我正在尝试抓取一个网站,当我发送 curl 请求时,它返回以下内容:

Error :: An Error Was Encountered The URI you submitted has disallowed characters.

但是当我使用 Postman 发送请求或使用浏览器输入请求时,它会返回正常页面。所以现在我相信问题出在我的代码中:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);

有什么解决办法吗?

my url

【问题讨论】:

标签: php curl web-scraping


【解决方案1】:

您必须对 URL 进行编码。

试试urlencode() 函数。 如果这不起作用,请使用此自定义函数

  function encode_url(string $string)
    {
        $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
        $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
        return str_replace($entities, $replacements, urlencode($string));
    }

我已经测试过了,这就是结果 https://kitchen.sayidaty.net/%D9%88%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D8%A8%D8%B2

这里是沙盒 URL http://sandbox.onlinephpfunctions.com/code/e67e3e386e85b52ddee4e2d651b70ff6228e4a6d

【讨论】:

  • 不工作,这两个函数都不能工作,因为它不是返回的 URL (aHR0cHM6Ly9raXRjaGVuLnNheWlkYXR5Lm5ldC/ZiNi12YHYp9iqLdin2YTYrtio2LI)
  • php原生支持urlencoding,查看php.net/manual/en/function.urlencode.php
  • @hanshenrik 是的,但有时它并不正确。就像在这种情况下。如果您对它进行本地编码,那么这就是输出:https%3A%2F%2Fkitchen.sayidaty.net%2F%D9%88%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7% D9%84%D8%AE%D8%A8%D8%B2 它甚至对冒号和斜杠进行编码。
  • @Jwan 谢谢你的回答,但我实际上通过$url = "https://kitchen.sayidaty.net/" . urlencode(str_replace("https://kitchen.sayidaty.net/","",$_GET['url'])) ;解决了我的问题
  • 但这是个坏主意。如果您打算使用 OOP,那么我强烈建议您使用我的方法。因此,以后如果您有其他链接,这样您就不必每次想要请求指定 URL 时都去代码并更改它。
【解决方案2】:

我投票以“需要调试详细信息”来结束这个问题,因为我需要查看您用于获取错误的确切代码。我可以*GUESS*代码是

<?php
$url = 'https://kitchen.sayidaty.net/وصفات-الخبز';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);

但是因为你没有分享该死的代码,我不得不猜测,这该死的不必要的浪费我的时间,都是因为你没有分享该死的代码。

无论如何,如果我猜对了,那么问题是你的 url 没有正确 urlencoded,在这种情况下你可以尝试在 php 中对其进行 urlencode

<?php

$url = 'https://kitchen.sayidaty.net/وصفات-الخبز';
$path = substr(parse_url($url,PHP_URL_PATH),strlen("/"));
$url = substr($url, 0, -(strlen($path))). urlencode($path);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec($ch);

但谁知道,毕竟你没有分享重现错误所需的代码。

【讨论】:

  • 大声笑,对不起,我的不耐烦了,我以为你不需要 URL,虽然我的问题已经解决了。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多