试图从reddit刮掉图像,无法清理字符串

时间:2013-06-15 01:59:16

标签: php json screen-scraping

所以我不是要求你修复我的剧本,如果你知道答案我会很感激,如果你只是指出我正确的方向。这是我找到的脚本,我正在尝试为项目编辑它。

我相信最近发生的是当我将该字符串输入$ url时,$ reddit的格式化会导致问题。我不知道如何过滤字符串。

在我发布之后,我有了在$ reddit上使用连接来获得所需结果而不是过滤字符串的想法。不确定。

谢谢!

picgrabber.php

include("RIS.php");

$reddit = "pics/top/?sort=top&t=all";

$pages = 5;

$t = new RIS($reddit, $pages);

$t->getImagesOnPage();

$t->saveImage();

RIS.php

class RIS {

var $after = "";
var $reddit = "";


public function __construct($reddit, $pages) {


    $this->reddit = preg_replace('/[^A-Za-z0-9\-]/', '' , $reddit);

    if(!file_exists($this->reddit)) {
        mkdir($this->reddit, 0755);
    }

    $pCounter = 1;
    while($pCounter <= $pages) {
        $url = "http://reddit.com/r/$reddit/.json?limit=100&after=$this->after";
        $this->getImagesOnPage($url);
        $pCounter++;
    }

}


private function getImagesOnPage($url) {

    $json = file_get_contents($url);
    $js = json_decode($json);

    foreach($js->data->children as $n) {
        if(preg_match('(jpg$|gif$|png$)', $n->data->url, $match)) {
            echo $n->data->url."\n";
            $this->saveImage($n->data->url);
        }

        $this->after = $js->data->after;
    }
}


private function saveImage($url) {
    $imgName = explode("/", $url);
    $img = file_get_contents($url);

    //if the file doesnt already exist...
    if(!file_exists($this->reddit."/".$imgName[(count($imgName)-1)])) {
        file_put_contents($this->reddit."/".$imgName[(count($imgName)-1)], $img);
    }
  }
}

注意:尝试在第33行的C:\ Program Files(x86)\ EasyPHP-DevServer-13.1VC9 \ data \ localweb \ RIS.php中获取非对象的属性

警告:第33行的C:\ Program Files(x86)\ EasyPHP-DevServer-13.1VC9 \ data \ localweb \ RIS.php中为foreach()提供的参数无效

致命错误:在第23行的C:\ Program Files(x86)\ EasyPHP-DevServer-13.1VC9 \ data \ localweb \ vollyeballgrabber.php中从上下文''调用私有方法RIS :: getImagesOnPage()

第33行:

       foreach($js->data->children as $n) {


        var_dump($url);

返回:

string(78) "http://reddit.com/r/pics/top/?sort=top&t=all/.json?limit=100&after=" NULL 

1 个答案:

答案 0 :(得分:0)

picgrabber.php中的$ reddit有GET参数

在RIS类中,您将该值嵌入到一个字符串中,该字符串中包含另一个GET,其中包含“.json”标记。

生成的网址是:  http://reddit.com/r/pics/top/?sort=top&t=all/.json?limit=100&after=

“.json”令牌需要在URL的位置部分结束之后和GET集之前。我也会改变任何添加“?”代币为“&amp;” (&符号)所以你决定连接到URL字符串的任何其他GET参数集都会成为附加参数。

像这样:  http://reddit.com/r/pics/top/.json?sort=top&t=all&limit=100&after=

不同之处在于,您的网址正在返回html代码,因为reddit服务器无法理解如何解析您发送的内容。你正试图用json解码器解析html。我的URL返回实际的json数据。这应该让你的json解码器返回一个实际的json对象数组。