水电工888 发表于 2015-8-29 07:00:19

PHP实现最简单爬虫原型

  最简单的爬虫模型应该是这样的:给一个初始url,爬虫把内容扒下拉,找页面里的url,在以这些url为起点,开始爬。
  下面是一个最简单的php实现的爬虫模型。


[*]<?php
[*]/**
[*]* 爬虫程序 -- 原型
[*]*
[*]* BookMoth 2009-02-21
[*]*/
[*]/**
[*]* 从给定的url获取html内容
[*]*
[*]* @param string $url
[*]* @return string
[*]*/
[*]function _getUrlContent($url){
[*]$handle = fopen($url, "r");
[*]if($handle){
[*]$content = stream_get_contents($handle,1024*1024);
[*]return $content;
[*]}else{
[*]return false;
[*]}
[*]}
[*]/**
[*]* 从html内容中筛选链接
[*]*
[*]* @param string $web_content
[*]* @return array
[*]*/
[*]function _filterUrl($web_content){
[*]$reg_tag_a = '/<.*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
[*]$result = preg_match_all($reg_tag_a,$web_content,$match_result);
[*]if($result){
[*]return $match_result;
[*]}
[*]}
[*]/**
[*]* 修正相对路径
[*]*
[*]* @param string $base_url
[*]* @param array $url_list
[*]* @return array
[*]*/
[*]function _reviseUrl($base_url,$url_list){
[*]$url_info = parse_url($base_url);
[*]$base_url = $url_info["scheme"].'://';
[*]if($url_info["user"]&&$url_info["pass"]){
[*]$base_url .= $url_info["user"].":".$url_info["pass"]."@";
[*]}
[*]$base_url .= $url_info["host"];
[*]if($url_info["port"]){
[*]$base_url .= ":".$url_info["port"];
[*]}
[*]$base_url .= $url_info["path"];
[*]print_r($base_url);
[*]if(is_array($url_list)){
[*]foreach ($url_list as $url_item) {
[*]if(preg_match('/^http/',$url_item)){
[*]//已经是完整的url
[*]$result[] = $url_item;
[*]}else {
[*]//不完整的url
[*]$real_url = $base_url.'/'.$url_item;
[*]$result[] = $real_url;
[*]}
[*]}
[*]return $result;
[*]}else {
[*]return;
[*]}
[*]}
[*]/**
[*]* 爬虫
[*]*
[*]* @param string $url
[*]* @return array
[*]*/
[*]function crawler($url){
[*]$content = _getUrlContent($url);
[*]if($content){
[*]$url_list = _reviseUrl($url,_filterUrl($content));
[*]if($url_list){
[*]return $url_list;
[*]}else {
[*]return ;
[*]}
[*]}else{
[*]return ;
[*]}
[*]}
[*]/**
[*]* 测试用主程序
[*]*
[*]*/
[*]function main(){
[*]$current_url = "http://hao123.com/";//初始url
[*]$fp_puts = fopen("url.txt","ab");//记录url列表
[*]$fp_gets = fopen("url.txt","r");//保存url列表
[*]do{
[*]$result_url_arr = crawler($current_url);
[*]if($result_url_arr){
[*]foreach ($result_url_arr as $url) {
[*]fputs($fp_puts,$url."\r\n");
[*]}
[*]}
[*]}while ($current_url = fgets($fp_gets,1024));//不断获得url
[*]}
[*]main();
[*]?>
  当然这只爬虫还需要进行下面的进化才可以:
  1、拼接更准确的url链接。现在的链接有可能是格式错误的。
  2、能够去掉重复的url链接。现在的爬虫会做非常多非常多的重复工作。
  3、避免爬虫怕成环路,一个永远右转的车,只能是300内环,它只会跑在三环路上,去不了别的地方。
  4、多线程或者多进程。因为php没有线程的概念,所以可能需要shell这样的东西来模拟了。
  5、……略去2的N次方个汉字。
  反正是意思一下就好了~
  from http://blog.iyunv.com/bookmoth/archive/2009/02/21/3916538.aspx
  
页: [1]
查看完整版本: PHP实现最简单爬虫原型