最近在做一些数据分析,由于上网找数据比较麻烦,所以写了一个采集网站数据的方法。具体方法如下:

方法一:QueryList

个人感觉比较好用,采集详情比较不错的选择,但是采集复杂一点的列表,不好用。具体使用:

控制器示例:

public function index(){
// 使用采集类
// 使用手册 :http://www.php.cn/php/php-QueryList3-ThinkPHP.html
import('Org.QL.QueryList');
$url = "http://www.zyctd.com/gqqg/";
$reg = array();
$reg['title'] = array('.sulist_title','text');
$reg['shuliang'] = array('.su_li1','html');
$obj = new \QueryList($url,$reg);
$data = $obj->jsonArr;
// foreach($data as $v){
// echo "<br>".$v['title'].'___'.$v['shuliang']."<br>";
// }
p($data);
}

方法二:simple_html_dom 

这个方法比较适合采集一点结构简单的页面,HTML标签的类名比较明确的页面,还不错。具体使用:

控制器示例:

public function index(){
// 参考文档:http://microphp.us/plugins/public/microphp_res/simple_html_dom/manual.htm#section_quickstart
// 下载地址:https://github.com/samacs/simple_html_dom/edit/master/simple_html_dom.php
// 使用方法:http://www.thinkphp.cn/topic/21635.html
import("Org.Util.simple_html_dom", '', '.php');
$html = file_get_html('http://www.zyctd.com/gqqg/');
$ret = $html->find('.supply_list_box ul',0)->first_child();
foreach($ret as $v){
echo $v;
};
}

第三种:获取页面HTMl,进行正则匹配采集

举例一个Demo:

采集一个页面:

http://www.zyctd.com/gqqg/

我要获取上面的四个信息:标题,数量,时间,跳转链接

获取这些信息,通过上面两种方法都采集不到,最后才选用的正则来采集。具体方法:

public function index(){
$url = "http://www.zyctd.com/gqqg/";
// http://www.zyctd.com/gqqg-p1.html
$supplyDB = M('supply');
$urlList = array();
$array = array();
for($x=1; $x<=1; $x++) {
array_push($urlList,"http://www.zyctd.com/gqqg-p".$x.".html");
};
foreach($urlList as $v){
$curPageList = $this->getInfo($v);
array_push($array,$curPageList);
};
foreach($array as $v){
foreach($v as $vv){
//echo $vv['title']."__".$vv['weight']."__".$vv['time']."<br>";
$data = array();
$data['title'] = $vv['title'];
$data['weight'] = $vv['weight'];
$data['add_time'] = $vv['add_time'];
$data['url'] = $vv['url'];
//$res = $supplyDB->add($data);
//echo $res;
echo "<p><span style='display:inline-block; width:110px;'>".$vv['title']."</span><span style='display:inline-block; width:110px;'>".$vv['weight']."</span><span style='display:inline-block; width:110px;'>".$vv['add_time']."</span><span style='display:inline-block; width:110px;'>".$vv['url']."</span></p>";
}
}
// 获取信息
//$curPageList = $this->getInfo($html);
//p($curPageList);
}
private function getInfo($url){
$html = $this->getHtml($url);
$array = array();
// 匹配所有的标题
preg_match_all("#<divclass=\"sulist_title\"><i></i><span>(.*?)</span></div>#",$html,$matches);
$all_title = $matches[1];
preg_match_all("#<i>发布时间:</i><span>(.*?)</span>#",$html,$matches);
// 匹配所有的发布时间
$all_time = $matches[1];
// 匹配所有的求购数量
preg_match_all("#<i>求购数量:</i><span>(.*?)</span>#",$html,$matches);
$all_weight = $matches[1];
// 匹配跳转链接
preg_match_all("#<atarget=\"_blank\"href=\"(.*?)\">#",$html,$matches);
$all_url = $matches[1];
// 组合
foreach($all_title as $k => $v){
$arr = array();
$arr['title'] = $v;
$arr['weight'] = $all_weight[$k];
$arr['add_time'] = $all_time[$k];
$arr['url'] = $all_url[$k];
array_push($array,$arr);
}
return $array;
}
private function getHtml($url){
$html = file_get_contents($url);
$html = preg_replace("#\n#","",$html);
$html = preg_replace("#\r#","",$html);
$html = preg_replace("#\\s#","",$html);
return $html;
}

thinkphp实现采集功能的三种方法!的更多相关文章

  1. Java实现ping功能的三种方法及Linux的区分

    前大半部份转自:https://blog.csdn.net/futudeniaodan/article/details/52317650 检测设备的运行状态,有的是使用ping的方式来检测的.所以需要 ...

  2. QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

    今天介绍一下一个小东西 — 如何让QComboBox实现复选功能?   需求: 下拉列表有复选功能 不可编辑 显示所有选中项   关于QComboBox的复选功能有几种方案: QStandardIte ...

  3. 前端下载excel文件功能的三种方法

    1 从后端接收json数据,前端处理生成excel下载 JsonExportExcel的github地址:https://github.com/cuikangjie/JsonExportExcel 这 ...

  4. 打印web页面指定区域的三种方法

    本文和大家分享一下web页面实现指定区域打印功能的三种方法,一起来看下吧. 第一种方法:使用CSS 定义一 个.noprint的class,将不打印的内容放入这个class内. 代码如下: <s ...

  5. STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...

  6. AJAX实现跨域的三种方法

    由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问. 比如说你的网站域名是aaa.com,想要通过AJAX请 ...

  7. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  8. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  9. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

随机推荐

  1. [Unity3D]关于NaN(Not a Number)的问题

    在游戏运行时,代码若写得不安全很容易出现NAN的异常.一旦NAN出现整个游戏不崩溃也坏死掉了,游戏上了则是要被直接打回来的节奏,更是一个开发及测试人员每人都要扣3000块的大BUG.   一般表现为: ...

  2. highcharts系列之xAxis

    xAxis定义的是x坐标轴的配置选项.默认情况下,x轴指的是水平轴,特殊指定的时候也可以作为垂直的轴使用,在多坐标系中,xAxis是有多个配置好了的轴object的数组. 下面来看一下,xAxis常用 ...

  3. 怎么用ABBYY在线浏览PDF文件

    ABBYY FineReader 让您可以从在线存储服务中打开图像或 PDF 文件,并将已识别文本保存至在线存储服务中,如 Dropbox.SkyDrive 或 Google Drive 等.通过在 ...

  4. 简单了解一下什么是Django或者说Django是做什么的?

    Django是什么? Django是一个基于Python的Web应用框架.它与Python的另外一个Web 框架 Flask最大的区别是,它奉行 “包含一切” 的哲学.该理念即为:创建 Web 应用所 ...

  5. Java加密和C#解密=>DES方法

    Java加密代码: import javax.crypto.*; import javax.crypto.*; import java.io.UnsupportedEncodingException; ...

  6. python的初始化运行了哪些?

    下面的3个print一个是在模块下面,一个是函数里面,一个是类名下面(不在方法里面) 1. 运行这段代码可以发现第3行和11行可以打印出来.第7行没有打印出来.所以可以放心,函数或者方法里面就算有错误 ...

  7. C# FileSystemWatcher 在监控文件夹和文件时的用法

    概述 最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要是有更改就要记录下来,我就整理下我对FileSystemWatcher 的理解和用法. FileSys ...

  8. 基于NDK的Android防破解& Android防破解 【转载】

    两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...

  9. 在python中重新导入模块

    重新加载模块 倘若,更改了已经在 Python shell 中导入的模块,然后重新导入该模块,Python 会认为“我已经导入了该模块,不需要再次读取该文件”,所以更改将无效. 要解决这个问题,有以下 ...

  10. Python 爬虫系列:糗事百科最热段子

    1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.分析页面,找到段子部分的位置, 需要一点CSS和HTML的知识 3.编写 ...