PHP file_get_contents等返回404,但可通过浏览器访问URL

时间:2018-06-29 06:09:10

标签: php web-scraping phantomjs command-line-interface

我正在尝试制作一个PHP CLI应用程序,该应用程序将刮取直接链接到图像的URL数组,例如:

https://static.wixstatic.com/media/6f6e33_4e2920af05b4440f87880154b5cfcc80~mv2_d_1500_1500_s_2.png

虽然您可以看到该URL是可公开访问的,但无论我尝试如何将其恢复并将其添加到本地计算机中,我都得到404。我已检查确保将allow_url_fopen设置为On php.ini,我尝试忽略404并仍然尝试返回结果(CURL,file_get_contents),欺骗我的用户代理,并且尝试了file_get_contents(),copy(),curl和其他几种方法,但都得到了相同的结果结果; 404。

这是有问题的功能的样子:

该函数采用文件路径数组并将其提供给下载功能。

     /**
     * @param array $locations
     * Downloads images at the specified locations into the directory specified in the constructor. 
     */
    public function scrapeImages($locations){
        echo "Attempting to download images from given source data. Standby... \n";
        foreach($locations as $location){
            echo "Scraping: ".$location;
            $fname = basename($location);
            //$this->downloadFile($location, $this->formatDirectory($this->dir).$fname);
            file_put_contents($this->formatDirectory($this->dir).$fname,$this->downloadFile($location));
        }
    }

实际执行下载的功能。

     /**
     * @param string $path 
     * Checks to see if a file exists and is readable then if it is, downloads it. 
     */
    public function downloadFile($path){
        if(!file_exists($path)){
            echo "File does not exist! \n";
        }
        if(!is_readable($path)){
            echo "File is not readable! \n";
        };
        return file_get_contents(trim($path));
    }

如果您需要进一步分析,可以在此处找到整个代码库- https://github.com/ErvinSabic/SabicRipper

我花了几个小时在网上搜索,最终放弃了。所以我想我会在这里发布。有什么建议吗?

先谢谢大家。

1 个答案:

答案 0 :(得分:0)

所以我最后要做的是使用wget,因为大多数其他方法都无法正常工作。以下是工作功能。

     /**
     * @param string $path 
     * Checks to see if a file exists and is readable then if it is, downloads it. 
     */
    public function downloadFile($path){
        echo "Grabbing File:" .$path."\n";
        shell_exec("wget -P".$this->getDirectory()." ".$path);
        //echo "Attempting to place ".basename($path)." in ".$this->getDirectory();
    }

我从来没有真正发现为什么它将404返回到可公开访问的URL。但这就是我想到的工作。您可以查看整个文件here.