php数组中的函数
所以我有一个网络爬虫,我正在工作。我有一个CSV文件,其中有大约一百万个网站,我想通过它进行爬网。我的问题是,我能够将CSV文件保存在数组中,但当我将其传递给爬网它的方法时;它似乎获取了第一个元素并对其进行爬网,而不是对整个数组进行爬网。有人能帮我吗php数组中的函数,php,web-crawler,Php,Web Crawler,所以我有一个网络爬虫,我正在工作。我有一个CSV文件,其中有大约一百万个网站,我想通过它进行爬网。我的问题是,我能够将CSV文件保存在数组中,但当我将其传递给爬网它的方法时;它似乎获取了第一个元素并对其进行爬网,而不是对整个数组进行爬网。有人能帮我吗 <?php include("classes/DomDocumentParser.php"); include("config.php"); $alreadyCrawled = array(); $
<?php
include("classes/DomDocumentParser.php");
include("config.php");
$alreadyCrawled = array();
$crawling = array();
$alreadyFoundImages = array();
$my_list = array();
function linkExists($url){
global $con;
$query = $con->prepare("SELECT * FROM sites WHERE url = :url");
$query ->bindParam(":url",$url);
$query->execute();
return $query->rowCount() != 0;
}
function insertImage($url,$src,$title,$alt){
global $con;
$query = $con->prepare("INSERT INTO images(siteUrl, imageUrl, alt, title)
VALUES(:siteUrl,:imageUrl,:alt,:title)");
$query ->bindParam(":siteUrl",$url);
$query ->bindParam(":imageUrl",$src);
$query ->bindParam(":alt",$alt);
$query ->bindParam(":title",$title);
return $query->execute();
}
function insertLink($url,$title,$description,$keywords){
global $con;
$query = $con->prepare("INSERT INTO sites(Url, title, description, keywords)
VALUES(:url,:title,:description,:keywords)");
$query ->bindParam(":url",$url);
$query ->bindParam(":title",$title);
$query ->bindParam(":description",$description);
$query ->bindParam(":keywords",$keywords);
return $query->execute();
}
function createLink($src,$url){
$scheme = parse_url($url)["scheme"]; // http or https
$host = parse_url($url)["host"]; // www.mohamad-ahmad.com
if(substr($src,0,2) =="//"){
// //www.mohanadahmad.com
$src = $scheme . ":" . $src;
}
else if(substr($src,0,1) =="/"){
// /aboutus/about.php
$src = $scheme . "://" . $host . $src;
}
else if(substr($src,0,2) =="./"){
// ./aboutus/about.php
$src = $scheme . "://" . $host . dirname(parse_url($url)["path"]) . substr($src ,1);
}
else if(substr($src,0,3) =="../"){
// ../aboutus/about.php
$src = $scheme . "://" . $host . "/" . $src;
}
else if(substr($src,0,5) !="https" && substr($src,0,4) !="http" ){
// aboutus/about.php
$src = $scheme . "://" . $host ."/" .$src;
}
return $src;
}
function getDetails($url){
global $alreadyFoundImages;
$parser = new DomDocumentParser($url);
$titleArray = $parser->getTitletags();
if(sizeof($titleArray) == 0 || $titleArray->item(0) == NULL){
return;
}
$title = $titleArray -> item(0) -> nodeValue;
$title = str_replace("\n","",$title);
if($title == ""){
return;
}
$description="";
$keywords="";
$metasArray = $parser -> getMetatags();
foreach($metasArray as $meta){
if($meta->getAttribute("name") == "description"){
$description = $meta -> getAttribute("content");
}
if($meta->getAttribute("name") == "keywords"){
$keywords = $meta -> getAttribute("content");
}
}
$description = str_replace("\n","",$description);
$keywords = str_replace("\n","",$keywords);
if(linkExists($url)){
echo "$url already exists <br>";
}
else if(insertLink($url,$title,$description,$keywords)){
echo "SUCCESS: $url <br>";
}
else{
echo "ERROR: Failed to insert $url <br>";
}
$imageArray = $parser ->getImages();
foreach($imageArray as $image){
$src = $image->getAttribute("src");
$alt = $image->getAttribute("alt");
$title = $image->getAttribute("title");
if(!$title && !$alt){
continue;
}
$src = createLink($src,$url);
if(!in_array($src,$alreadyFoundImages)){
$alreadyFoundImages[] = $src;
insertImage($url,$src,$alt,$title);
}
}
}
function followLinks($url) {
global $crawling;
global $alreadyCrawled;
$parser = new DomDocumentParser($url);
$linkList = $parser->getLinks();
foreach($linkList as $link){
$href = $link->getAttribute("href");
if(strpos($href,"#") !==false){
// Ignore anchor url
continue;
}
else if(substr($href,0,11)== "javascript:"){
// Ignore javascript url
continue;
}
$href = createLink($href,$url);
if(!in_array($href,$alreadyCrawled)){
$alreadyCrawled[] = $href;
$crawling[] = $href;
//getDetails contain the insert into db
getDetails($href);
}
}
array_shift($crawling);
foreach($crawling as $site){
followLinks($site);
}
}
function fill_my_list(){
global $my_list;
$file = fopen('top-1m.csv', 'r');
while( ($data = fgetcsv($file)) !== false ) {
$startUrl = "https://www.".$data[1];
$my_list[] = $startUrl;
}
foreach($my_list as $key => $u){
followLinks($u);
}
}
fill_my_list();
?>
您可以通过php.net执行类似的操作
$row = 1;
if (($File = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($File, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
//Use $data[$c];
}
fclose($File);
}
$row=1;
if($File=fopen(“test.csv”,“r”)!==FALSE){
while(($data=fgetcsv($File,1000,“,”)!==FALSE){
$num=计数($data);
echo“$num字段位于第$row行:
\n”;
$row++;
对于($c=0;$c<$num;$c++){
echo$data[$c]。“
\n”;
}
//使用$data[$c];
}
fclose($文件);
}
这里有更多的例子:这里并不清楚您需要什么帮助。你能试着让你的问题更明确一些吗?首先:如果你有一个CSV文件,那么将整个列表加载到内存中的目的是什么?另外,我强烈建议不要递归调用followLinks。根据页面的不同,这将产生一个非常大的调用堆栈-很可能,您的初始循环永远不会到达
$my_list
中的第二个条目。您好,Damocles,我承认在数组中保存没有任何意义,但我有点困惑它为什么不起作用,所以我尝试了所有方法。但我可以问一下,为什么它永远不会进入第二个条目,因为这就是问题所在。如何解决呢?谢谢你,你是如何推断这个样板样本可能被证明是一个问题的解决方案,而这个问题到目前为止还没有被确定…(或者它可能是递归问题的重点)?这充其量只是一个评论,IMHO。我看得很清楚,OP不要求递归,我可以看出OP不是一个新的程序员,如果需要递归,他会问。无论如何,如果也递归地请求,OP只需要打印($data)
在给定的示例中,他可能需要更少的递归:-)