实现SOCKET模拟网络爬虫主要包括以下几个部分:
使用SOCKET获取指定页的内容。
使用get_meta_tags()函数,分析网页的META、TITLE等标签内容。
解析TITLE、链接或网页内容,可以使用正则表达式,来取得需要的内容。
SOCKET爬虫实现代码
简单爬虫实现代码和使用方法,保存到spider.php中,详细代码如下所示:
/*********************spider.php********************/
class spider {
private $_url = “”; //定义用于保存URL的变量
private $_sites = “”; //定义用于保存网站相关内容的变量
function spider($url) { //构造函数,用于初始化变量
$this->_url = $url;
}
function start() {
$content = $this->socketOpen($this->_url); //使用socketOpen()方法,链接指定的服务器
$this->_sites[”meta”] = $this->getMeta($content); //使用getMeat()方法,获取meta信息
$this->_sites[”title”] = $this->getTitle($content); //使用getTitle()方法,获取title信息
$this->_sites[”detail”] = $this->getDetail($content);//使用getDetail()方法,获取内容信息
$this->_sites[”links”] = $this->getLinks($content); //使用getLinks()方法,获取内容链接信息
}
function getMeta($content){
$file = “metaCache”; //向于保存缓存文件的名称
file_put_contents($file,$content); //将缓存保存到缓存文件中
$meta = get_meta_tags($file); //使用get_meta_tags()取得内容的meta信息
return $meta; //返回meta信息
}
function getDetail($contents) {
preg_match('/(.+)<\/body>/s', $contents, $matches); //使用正则表达式处理内容
$body = $this->StripHTML($matches[1]); //去掉特殊HTML字符
$body = strip_tags($body); //清除内容中的特殊标签
return substr($body, 0, 400); //返回内容的前400个字符
}
function getTitle($contents) {
preg_match('/
return $matches[1]; //返回处理结果中的标题部分
}
function getLinks($content){
$pat = '/(.*?)<\/a>/i'; // 处理链接的正则表达式
preg_match_all($pat, $content, $m); //使用正则表达式处理链接
return $m;
}
//获取网址内容
function socketOpen($url) {
$fp = fsockopen($url, 80, $errno, $errstr, 30); //使用fsockopen()建立SOCKET链接
if ($fp === false) {
echo “连接远程服务器失败:$errstr ($errno)
\n”;
return false;
} else {
$out = “GET / HTTP/1.1\r\n”; //创建要发送的头文件信息
$out .= “Host: ” . $url . “\r\n”; //指定头文件信息中的主机内容
$out .= “Connection: Close\r\n\r\n”;
fwrite($fp, $out); //使用fwrite()函数,发送请求
$contents = “”;
while (!feof($fp)) { //使用while循环读取返回的数据
$contents .= fgets($fp, 1024);
}
fclose($fp); //关闭句柄
return $contents; //返回获取的内容
}
}
//去掉HTML中不相关的代码
function StripHTML($string) {
$pattern = array (
“''si”,
“'
'si”
); //建立正则表达式
$replace = array (
“”,
“”
); //建立替换字符数组
return preg_replace($pattern, $replace, $string);//替换内容中HTML并返回替换后的内容
}
function show(){
echo “
"; print_r($this->_sites); //显示保存到$_sites公共变量中的内容 echo "
“;
}
}
//使用WEB爬虫的方法
$spider = new spider(“www.163.com”); //实例化spider类,并设置需要抓取的网站
$spider->start(); //开始抓取数据
$spider->show(); //显示抓取的内容
?>
运行spider.php
源程序解读
在spider.php的代码中,定义了spider()类,类中包括9个函数:
spider()函数用于初始化spider类的相关设置。
getMeta()函数,将网页内容保存为文件后,使用get_meta_tags()函数分析META数据后并返回。
getDetail()函数,将网页内容中的body标签中的内容取出,并去掉相关HTML标记。取处理后字符串的前400个字符,并返回该字符串。
getTitle()函数,将网页内容中的title标签中的内容取出,并返回该字符串。
getLinks ()函数,使用正则表达式,取出网页中所有的链接,并以数组的形式返回。
sockOpen()函数,使用fsockopen()函数与主机建立连接后,向主机发送头文件信息,然后使用fgets()函数,读取主机返回的内容。
StripHTML ()函数,用于去掉内容中与style和script标签相关的内容。
show()函数,用于输出网站分析后取得的内容。
spider.php中的代码,演示了抓取网页,并进行分析的过程。得出的内容以数组的形式进行了保存。在实际应用中,可以对抓取内容中的链接进行下一级分析,而获取的内容也可以保存到数据库中,供以后调用。
评论