用PHP抓取网页

原创 2004年10月02日 14:15:00

用PHP抓取网页

 
作者: 共创联盟
加入时间: 2003-11-24
浏览次数: 322

  抓取网页,并将文字和图片存入数据库中,利用getimg.php?id=读取数据库中的图片
getarticle.php?id=读取文档

<?

/**建表文档 articletype对应的类型 1:oracle,2:java,3:system
CREATE TABLE article (
  id int(6) NOT NULL auto_increment,
  title varchar(80) default NULL,
  content text,
  url varchar(80) default NULL,
  joindate varchar(12) default NULL,
  articletype int(2) not null,
  PRIMARY KEY  (id)
) ;
CREATE TABLE images (
  id int(4) NOT NULL auto_increment,
  bin_data longblob,
  filetype varchar(50) default NULL,
  title varchar(50) default NULL,
  articleid int(6) NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;
*/

class SaveWeb
{
var $title;
var $url;
var $typeid;
var $content;
var $getUrl = true;
var $getimg = "getimg.php?id=";
var $dbuser = "root";
var $dbpassword = "whf76128";
var $dbname = "tech";
var $dbhost = "127.0.0.1";

function SaveWeb($title,$url,$typeid) //初始化,
{
$this->title=$title;
$this->url=$url;
$this->typeid=$typeid;
}
function setContent($html) //初始化,
{
$this->content = $html;
$this->getUrl = false;
}
function saveContent() //直接存储段落文字
{
$date = gmdate("Y-m-d");
$data = nl2br($this->content);
$data = addslashes($data);
MYSQL_CONNECT( $this->dbhost, $this->dbuser, $this->dbpassword);
mysql_select_db( $this->dbname);
$result=MYSQL_QUERY( "INSERT INTO article (title,content,url,joindate,articletype)  VALUES ('$this->title','$data','$this->url','$date',$this->typeid)");
$id= mysql_insert_id();
MYSQL_CLOSE();
return $id;
}
function webSave() //存储页面
{
if($this->title==""||$this->url=="")
return false;
if($this->getUrl==true)
$text = $this->getHtml($this->url);
else
{
$text = $this->content;
}
$text2 = $this->parserHtml($text);
$id = $this->saveHtml($text2);
$this->updateImgPID($id,$this->title);
$this->delimg();
return $id;
}

//在$strobj中查找$strchild,返回值为位置(找到)和false(没有找到相应的字符串).
function strfind($strobj,$strchild,$int)
{
$intobj=strlen($strobj);
$intchild=strlen($strchild);

while($int<=$intobj)
{
if(strtolower(substr($strobj,$int,1))==$strchild[0]) //当从$strobj上截取的首字符与$strchild的首字符相同时,作进一步判断.
{
if(strtolower(substr($strobj,$int,$intchild))==$strchild)
return $int;
}
$int++;
}
return false;
}

function getHtml($url)
{
if(($fp = fopen($url,"r"))==false)
{
echo "<font color=red>读取失败,文件位置:$url</font><br>";
return false;
}

$data = "";
while(!feof($fp))
{
$data = $data.fread($fp,512);
}
fclose($fp);
return $data;
}
function delImg()
{
MYSQL_CONNECT( $this->dbhost, $this->dbuser, $this->dbpassword);
mysql_select_db( $this->dbname);
$result=MYSQL_QUERY( "delete from images where articleid = 0");
MYSQL_CLOSE();
}
function updateImgPID($id,$title)
{
MYSQL_CONNECT( $this->dbhost, $this->dbuser, $this->dbpassword);
mysql_select_db( $this->dbname);
MYSQL_QUERY( "update images set articleid = $id where title='$title'");
MYSQL_CLOSE();
}

function saveHtml($data)
{
$date = gmdate("Y-m-d");
$data = addslashes($data);
MYSQL_CONNECT( $this->dbhost, $this->dbuser, $this->dbpassword);
mysql_select_db( $this->dbname);
$result=MYSQL_QUERY( "INSERT INTO article (title,content,url,joindate,articletype)  VALUES ('$this->title','$data','$this->url','$date',$this->typeid)");
$id= mysql_insert_id();
MYSQL_CLOSE();
return $id;
}

function saveImg($url)
{
$data = $this->getHtml($url);
$data = addslashes($data);
MYSQL_CONNECT( $this->dbhost, $this->dbuser, $this->dbpassword);
mysql_select_db( $this->dbname);
$result=MYSQL_QUERY( "INSERT INTO images (bin_data,filetype,title,articleid)  VALUES ('$data','".$this->getContentType($url)."','$this->title',0)");
$id= mysql_insert_id();
MYSQL_CLOSE();
return $id;
}

function getContentName($inFileName)
{
return basename($inFileName);
}
function getContentType($inFileName)
{
//--剥去路径
$inFileName = basename($inFileName);
//--检查文件扩展名
if(strrchr($inFileName, ".") == false)
{
return  "application/octet-stream";
}
//--得到文件扩展名,并判断文件类型
$extension = strrchr($inFileName, ".");
switch($extension)
{
case  ".gif": return  "image/gif";
case  ".gz": return  "application/x-gzip";
case  ".htm": return  "text/html";
case  ".html": return  "text/html";
case  ".jpg": return  "image/jpeg";
case  ".tar": return  "application/x-tar";
case  ".txt": return  "text/plain";
case  ".zip": return  "application/zip";
case  ".png": return "image/png";
case  ".bmp": return "image/bmp";
default:        return  "application/octet-stream";
}
return  "application/octet-stream";
}

function parserHtml($text)
{
$int = 0;
$baseUrl = parse_url($this->url);
$urlHost = "http://".$baseUrl["host"];
$urlDir = $urlHost.dirname($baseUrl["path"]);
$urlDir = str_replace("//","/",$urlDir);
//更新<img>标签
while($int = $this->strfind($text,"<img",$int))
{
$closeCharPos = $this->strfind($text,">",$int);
$tmpTxt = substr($text,$int,$closeCharPos-$int+1);
$srcStart = $this->strfind($tmpTxt,"src=",0);
$srcEnd = 0;
switch(substr($tmpTxt,$srcStart+4,1))
{
case '"':
$srcEnd = $this->strfind($tmpTxt,'"',$srcStart+5);
$imgUrl = substr($tmpTxt,$srcStart+5,$srcEnd-$srcStart-5);
break;
case "'":
$srcEnd = $this->strfind($tmpTxt,"'",$srcStart+5);
$imgUrl = substr($tmpTxt,$srcStart+5,$srcEnd-$srcStart-5);
break;
default:
$srcEnd = $this->strfind($tmpTxt," ",$srcStart+4);
if($srcEnd == false)
$srcEnd = $this->strfind($tmpTxt,'>',$srcStart+4);
$imgUrl = substr($tmpTxt,$srcStart+4,$srcEnd-$srcStart-4);
}
$tempImgUrl = $imgUrl;
$tempFile = parse_url($this->getimg);


if($this->strfind($tmpTxt,"http://",0)!=true)
{
switch(substr($imgUrl,0,1))
{
case "/":
$imgUrl = $urlHost.$imgUrl;
break;
default:
if(substr($urlDir,strlen($urlDir)-1,1)=="/")
$imgUrl = $urlDir.$imgUrl;
else
$imgUrl = $urlDir."/".$imgUrl;
}
}

if($this->strfind($imgUrl,$tempFile["path"],0)!=false)
{
$int++;
continue;
}
$id = $this->saveImg($imgUrl);
if($id == false)
{
$int++;
continue;
}
$newImgUrl = $this->getimg.$id;
$text = str_replace($tempImgUrl,$newImgUrl,$text);
$int++;
}
$int = 0;
//更新<a></a>标签
while($int = $this->strfind($text,"<a",$int))
{
$closeCharPos = $this->strfind($text,">",$int);
$tmpTxt = substr($text,$int,$closeCharPos-$int+1);
$srcStart = $this->strfind($tmpTxt,"href=",0);
$srcEnd = 0;
switch(substr($tmpTxt,$srcStart+5,1))
{
case '"':
$srcEnd = $this->strfind($tmpTxt,'"',$srcStart+6);
$imgUrl = substr($tmpTxt,$srcStart+6,$srcEnd-$srcStart-6);
break;
case "'":
$srcEnd = $this->strfind($tmpTxt,"'",$srcStart+6);
$imgUrl = substr($tmpTxt,$srcStart+6,$srcEnd-$srcStart-6);
break;
default:
$srcEnd = $this->strfind($tmpTxt," ",$srcStart+5);
if($srcEnd == false)
$srcEnd = $this->strfind($tmpTxt,'>',$srcStart+5);
$imgUrl = substr($tmpTxt,$srcStart+5,$srcEnd-$srcStart-5);
}
$tempImgUrl = $imgUrl;
if($this->strfind($tmpTxt,"http://",0)!=true)
{
switch(substr($imgUrl,0,1))
{
case "/":
$imgUrl = $urlHost.$imgUrl;
break;
default:
if(substr($urlDir,strlen($urlDir)-1,1)=="/")
$imgUrl = $urlDir.$imgUrl;
else
$imgUrl = $urlDir."/".$imgUrl;
}
$text = str_replace($tempImgUrl,$imgUrl,$text);
}
$int++;
}
return $text;
}
}


?>

【PHP-网页内容抓取】抓取网页内容的两种常用方法

说到网页内容的抓取,最常用的两种方式: 1.利用file_get_contents()函数,简简单单; 2.CURL抓取工具。CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TEL...
  • qq_28194557
  • qq_28194557
  • 2017年04月24日 15:01
  • 741

php 抓取页面乱码

在抓取页面的时候出现类似�������这样乱码解决方法如下1、转换编码 str=mbconvertencoding(str = mb_convert_encoding(str, “utf-8”, ...
  • HobHunter
  • HobHunter
  • 2017年07月19日 09:11
  • 711

PHP使用CURL抓取网页

CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTP...
  • zls986992484
  • zls986992484
  • 2016年09月20日 21:56
  • 2606

【php网页爬虫】php抓取网页数据

插件介绍: PHP Simple HTML DOM解析类:Simple HTML DOM parser 帮我们很好地解决了使用 php html 解析 问题。可以通过这个php类来解析html文档,对...
  • C_jian
  • C_jian
  • 2017年09月20日 23:21
  • 1041

用PHP抓取页面并分析

在做抓取前,记得把php.ini中的max_execution_time设置的大点,不然会报错的。   一、用Snoopy.class.php抓取页面   一个挺萌的...
  • kuihuan2771
  • kuihuan2771
  • 2017年03月15日 15:50
  • 167

php 实现信息采集(网页内容抓取)程序代码

php 实现信息采集(网页内容抓取)程序代码
  • xz_src
  • xz_src
  • 2017年06月24日 21:28
  • 1557

php抓取网页

用php抓取页面的内容在实际的开发当中是非常有用的,如作一个简单的内容采集器,提取网页中的部分内容等等,抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,以下就是几种常用的用php抓取网页中...
  • bingsanchun1
  • bingsanchun1
  • 2014年06月14日 00:21
  • 953

PHP抓取网页内容获得网页源代码

1、 file_get_contents获取 $url="http://www.baidu.com/"; $fh= file_get_contents('http://www.hxfzzx.co...
  • han0207xiao
  • han0207xiao
  • 2016年08月29日 17:36
  • 6667

php实战之使用curl抓取网站数据

之前做过一个网站数据抓取的工作,让我充分感受到了计算机科学的生产力。之前为了抓取网站源数据的数据,我们公司只能依靠人多力量大的方式,一点一点从源网站抠,整整干了三天,干得头昏脑涨,听老板说以前有php...
  • htmlgood
  • htmlgood
  • 2015年11月01日 15:41
  • 3789

php:从网页中提取关键字

能够轻松的从网页中提取关键字。 $meta = get_meta_tags('http://www.emoticode.net/'); $keywords = $meta['keywords']; ...
  • zyb_icanplay7
  • zyb_icanplay7
  • 2013年11月26日 10:04
  • 542
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用PHP抓取网页
举报原因:
原因补充:

(最多只允许输入30个字)