第一步:把要采集的 链接 准备好
可以是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);
}
}
}
?>