我正在为学校做一个研究项目抓取密码学家的数据。我有一个非常简单的类,它转到一个网页,输入该页面的每个href
链接,并将它们写入文件。
当我运行代码时,我实际上并没有收到特定的错误,但现在它只是写入一个空白文件。我的问题似乎是我的 getter 和 setter 不知道我的私有实例变量,此外,我的对象 ($obj) 似乎不知道我的 getter 和 setter,所以我有点困惑。
我正在使用 JetBrains PHPStorm。感谢大家的帮助和支持
编辑:我已经更新了下面的代码,它会运行得很好。对于任何有兴趣使用它的人 - 此代码将从网页上删除所有链接,并将每个链接的内容存储在文件中。我可能最终会修改它以去除所有 html,以便我只获取原始文本,然后对输出进行 JSON 编码,以便可以轻松解析。
<?php
class Scraper
{
/*
=============================================
SET UP THE BASE DIRECTORY FOR SCRAPING,
AND OPEN FILES TO WRITE INFORMATION TO
==============================================
*/
private $basedir; //BASE DIRECTORY PATH FOR SCRAPING
private $outfile; //NAME OF FILE TO WRITE TO
/*
=============================================
SETTER FOR BASE DIRECTORY
==============================================
*/
public function setBaseDirectory($base)
{
$this->basedir = $base;
}
/*
=============================================
SETTER FOR OUTFILE
==============================================
*/
public function setOutfile($file)
{
$this->outfile = $file;
}
/*
=============================================
GETTER FOR OUTFILE
==============================================
*/
public function getOutfile()
{
return $this->outfile;
}
/*
=============================================
GETTER FOR BASE DIRECTORY
==============================================
*/
public function getBaseDirectory()
{
return $this->basedir;
}
/*
=============================================
THIS FUNCTION TAKES THE HYPERLINKS OUT OF
A WEB PAGE AND RETURNS THEM IN AN ARRAY.
ITS SCOPE IS PRIVATE SINCE IT IS A HELPER
METHOD FOR GETDIRCONTENTS
=============================================
*/
private function grabLinks($contents)
{
$last_dir = array();
$URLs = array();
preg_match_all("|href=['"'](.*?)['"']|", $contents, $match);
foreach ($match as $key => $value)
foreach ($value as $key2 => $TheUrl)
$URLs[] = $TheUrl;
for ($i =0; $i < (count($URLs)/2);$i++)
{
$item = str_replace('href=','',(string)$URLs[$i]);
$item = str_replace('"','',$item);
array_push($last_dir, $item);
}
return $last_dir;
}
/*
=============================================
THE GOAL OF THIS FUNCTION IS TO GET THE
CONTENTS OF EACH FORUM POST AND WRITE THEM
INTO A FILE. MAY EXPLORE CREATING AN
ASSOCIATIVE ARRAY AND JSON_ENCODING THEM
BASED ON NAME = POST NAME VALUE = FILE CONTENTS
=============================================
*/
public function getDirContents($dir)
{
$contents = file_get_contents($dir);
$linksArray = $this->grabLinks($contents);
for ($i = 0; $i < count($linksArray);$i++)
{
$contents = strip_tags(file_get_contents($dir.$linksArray[$i])); //GET CONTENTS OF FILE FROM LINK
fwrite($this->getOutfile(), $contents);
$debug = fopen("debugLog.txt", "w");
fwrite($debug, "debug contents: 'n'n".$this->getOutfile().$this->getBaseDirectory()." $contents 'n'n");
}
}
}
/*
=============================================
CREATE NEW INSTANCE OF CLASS AND CALL FUNCTION
TO GET CONTENTS OF DIRECTORY ITEMS
==============================================
*/
$obj = new Scraper();
$obj->setBaseDirectory("http://satoshi.nakamotoinstitute.org/posts/");
$obj->setOutfile(fopen("Satoshi_Forum_Posts.txt", "w"));
$obj->getDirContents($obj->getBaseDirectory());
echo $obj->getBaseDirectory();
echo $obj->getOutfile();
好的
,我已经能够找到问题的根源,我很抱歉浪费了那些在上面发表评论的人的时间。事实证明,我的 PHP 代码很好,并且在我进行了 1 次更改后运行。
我刚刚开始使用 JetBrains PHPStorm IDE,并将此类文件从我的桌面而不是 JetBrains 的工作区加载到编辑器中。一旦我合并了 Bulk 和 Jonathan Kuhn 提到的小语法更改,我在设置程序时定义的工作区内在 JetBrains 中创建了一个新项目,所有警告消息都消失了(我仍然不完全理解为什么它们消失了)。
我运行了我的代码并产生了所需的结果。我将在问题中发布更新的代码以及注释中建议的更新,以便任何需要此类脚本的人都可以使用它。再次感谢所有愿意提供帮助的人!