【问题标题】:Trying to scrape images from reddit, having trouble cleaning up strings试图从 reddit 中抓取图像,无法清理字符串
【发布时间】:2013-06-15 01:59:16
【问题描述】:

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

我相信当我将该字符串输入到 $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 

【问题讨论】:

  • 第 33 行是哪一个?
  • 你能不能var_dump()foreach之前的所有变量; $url$json$js?
  • 当我 var_dump() 三个中的一个时,它会将我直接带到 url,有什么建议吗?
  • 那个url返回的不是json而是一个html页面。
  • 我对 json 了解不够,无法知道这里发生了什么。

标签: php json screen-scraping


【解决方案1】:

picgrabber.php 中的$reddit 有 GET 参数

在 RIS 类中,您将该值嵌入到一个字符串中,该字符串中设置了另一个 GET,其间带有“.json”标记。

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

“.json”标记需要出现在 url 的位置部分末尾和 GET 集之前。我还会更改任何添加“?”标记为“&”(与号),因此您决定连接到 URL 字符串的任何其他 GET 参数集都将成为附加参数。

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

不同之处在于,您的 url 正在返回 html 代码,因为 reddit 服务器不了解如何解析您发送的内容。您正在尝试使用 json 解码器解析 html。我的 URL 返回实际的 json 数据。那应该让您的 json 解码器返回一个实际的 json 对象数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 2017-09-05
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2013-02-03
    相关资源
    最近更新 更多