tp5 如何做数据采集

第一步:把要采集的 链接  准备好

可以是1个页面,也可以是多个

比如

在这里插入图片描述

	第2步:把页面下载到本地
	
	我用迅雷下载的,新建任务,就可以批量下载网页

 	第3步:打开 tp,新建路由
 	
 	Route::rule('home_caiji','home/xiazai/caiji'); 	// 测试采集
 	
 	第4步:新建 xiazai 控制器,内容如下

如下,是整个控制器内容,在浏览器运行即可

获取title,content的时候,我是用 正则匹配 html 标签,获取的
其中 ([\s\S]?) 是我们想要获取的内容,[\s\S]?是我们匹配标签的时候,
如果标签内容不一样,可以用[\s\S]*?来忽略不一样的标签,

比如匹配内容的时候
<div class="contson" id="contson9822debcdc64 ">
醉里挑灯看剑,梦回吹角连营。八百里分麾下炙,五十弦翻塞外声。沙场秋点兵。<br />马作的卢飞快,弓如霹雳弦惊。了却君王天下事,赢得生前身后名。可怜白发生!
</div>

<div class="contson" id="contsonf090d65212f4">
明月别枝惊鹊,清风半夜鸣蝉。稻花香里说丰年,听取蛙声一片。 <br />七八个星天外,两三点雨山前。旧时茅店社林边,路转溪桥忽见。(溪桥 一作:溪头)
</div>

这两个内容标签,格式是一样的,只是id不一样,我们匹配的时候,就要忽略id
来匹配中间的内容

使用方法如下
preg_match('/<div class="contson" id="[\s\S]*?">([\s\S]*?)<\/div>/',$val,$content);

下面是控制器方法

<?php
namespace app\home\controller;

use app\index\controller\Commen; 
use think\Controller;
use think\Session;
use think\Db;
use think\Request;
use think\Validate;

class Xiazai extends Commen
{
	function caiji()
	{
		$jid = substr(__FILE__,strrpos(__FILE__,'\\')+1,strrpos(__FILE__,'.')-strrpos(__FILE__,'\\')-1);
		// 下载网页地址,我存放在一个文件夹中 
	    $dir = 'E:/my/20190110/xinqiji';
	    $this->showDir($dir);

}

// tp 里遍历文件夹,做批量采集
function showDir($filedir){
    if(is_dir($filedir)){
        //打开目录  
        $dir = @ dir($filedir);  
        while (($file = $dir->read())!==false){  
             if(is_dir($filedir."/".$file) AND ($file!=".") AND ($file!="..")) {  
                   $this->showDir($filedir."/".$file);  
                   echo '111';
              } else {
                  if ($file != "." and $file != ".."){  
                      $this->getDBData($filedir.'/'.$file,$file);
                       echo  $filedir.'/'.$file.'<br>';
                   		echo '222';

                       //echo $file;
                 }  
              }  
         }
        $dir->close();
    }else{
        $this->getDBData($filedir);
        echo  $filedir;
        echo '333';
    }
}  

function getDBData($filename,$file) //file指文件名100000.HTML
{
	preg_match('/(\d{0,20})\.aspx/',$file,$ids);		
	// 读取 单个网页 源代码
	$urls=file_get_contents($filename); 

	// 获取一首诗词
	preg_match_all('/<p><a style=([\s\S]*?)<div class="tool">/',$urls,$match);	 
	//exit;
	// var_dump($match);die;
	foreach($match[1] as $val)
	{
		// 获取标题,内容
		preg_match('/target="_blank"><b>([\s\S]*?)<\/b>/',$val,$title);
		preg_match('/<div class="contson" id="[\s\S]*?">([\s\S]*?)<\/div>/',$val,$content);

		// var_dump($title);
		// die;
		if(isset($title[1]))
		{
			$data['art_title'] = $title[1];
		}

		if(isset($content[1]))
		{
			$data['art_content'] = $content[1];
		}

		// 我要插入文章表标题内容和art_id,关联表插入type_id,
		// 先插入关联表,获取id,插入文章表art_id
		// 关联表的 id 是文章表的art_id, 其中 type_id 从cate表中获取
		// 匹配 type_id
	
		$bb['uid'] = '11';

		$type_name = explode('·',$data['art_title']);

		//有的词名不对,我拼接了一下
		if(!isset($type_name[1]))
		{
			// 拼接词名,获取词牌
			$dian = strpos($data['art_content'],",");
			$ju = strpos($data['art_content'],"。");
			if($dian < $ju)
			{
				$con = explode(',',$data['art_content']);   // 有的第一句是,号,有的是句号
				$con_ci = $con[0];
				$data['art_title'] = $data['art_title'].'·'.$con_ci;
				// var_dump($data['art_title']);
				// echo '111';
				// echo '<hr>';
			}else{
				$con = explode('。',$data['art_content']);   // 有的第一句是,号,有的是句号
				$con_ci = $con[0];
				$data['art_title'] = $data['art_title'].'·'.$con_ci;
				// var_dump($data['art_title']);
				// echo '222';
				// echo '<hr>';

			}

		}
		
		$type_name222 = explode('·',$data['art_title']);
		$type_name222 = $type_name222[0];

		// 从 cate 表中获取 type_id
		$type = DB::name('cate')->where('name',$type_name222)->find();
		if(isset($type['id']))
		{
			$bb['type_id'] = $type['id'];
		}else{
			$bb['type_id'] = '74';
		}
		
		// 同时插入两张表,它的id是article的art_id
		
		$res = DB::name('aaguanlian')->insert($bb);
		
		// 这个方法可以得到新插入的id
		
		$art_id = Db::name('aaguanlian')->getLastInsID();   
		
		// 最后插入文章表
		$data['art_id'] = $art_id;
		$data['art_author'] = '辛弃疾';
		$data['create_time'] = date('Y-m-d H:i:s');
		$result = DB::name('article_ci')->insert($data);
	
	}	
}

}
?>

猜你喜欢

转载自blog.csdn.net/qq_39835505/article/details/86477043
今日推荐