php实现简单爬虫的开发


Posted in PHP onMarch 28, 2016

有时候因为工作、自身的需求,我们都会去浏览不同网站去获取我们需要的数据,于是爬虫应运而生,下面是我在开发一个简单爬虫的经过与遇到的问题。

    开发一个爬虫,首先你要知道你的这个爬虫是要用来做什么的。我是要用来去不同网站找特定关键字的文章,并获取它的链接,以便我快速阅读。

    按照个人习惯,我首先要写一个界面,理清下思路。

    1、去不同网站。那么我们需要一个url输入框。
    2、找特定关键字的文章。那么我们需要一个文章标题输入框。
    3、获取文章链接。那么我们需要一个搜索结果的显示容器。

<div class="jumbotron" id="mainJumbotron">
 <div class="panel panel-default">
 
  <div class="panel-heading">文章URL抓取</div>
 
  <div class="panel-body">
   <div class="form-group">
    <label for="article_title">文章标题</label>
    <input type="text" class="form-control" id="article_title" placeholder="文章标题">
   </div>
   <div class="form-group">
    <label for="website_url">网站URL</label>
    <input type="text" class="form-control" id="website_url" placeholder="网站URL">
   </div>
 
   <button type="submit" class="btn btn-default">抓取</button>
  </div>
 </div>
 <div class="panel panel-default">
 
  <div class="panel-heading">文章URL</div>
 
  <div class="panel-body">
   <h3></h3>
  </div>
 </div>
</div>

直接上代码,然后加上自己的一些样式调整,界面就完成啦:

php实现简单爬虫的开发

那么接下来就是功能的实现了,我用PHP来写,首先第一步就是获取网站的html代码,获取html代码的方式也有很多,我就不一一介绍了,这里用了curl来获取,传入网站url就能得到html代码啦:

private function get_html($url){
 
 $ch = curl_init();
 
 $timeout = 10;
 
 curl_setopt($ch, CURLOPT_URL, $url);
 
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
 curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
 
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36');
 
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 
 $html = curl_exec($ch);
 
 return $html;
 
}

虽然得到了html代码,但是很快你会遇到一个问题,那就是编码问题,这可能让你下一步的匹配无功而返,我们这里统一把得到的html内容转为utf8编码:

$coding = mb_detect_encoding($html);
if ($coding != "UTF-8" || !mb_check_encoding($html, "UTF-8"))
$html = mb_convert_encoding($html, 'utf-8', 'GBK,UTF-8,ASCII');

得到网站的html,要获取文章的url,那么下一步就是要匹配该网页下的所有a标签,需要用到正则表达式,经过多次测试,最终得到一个比较靠谱的正则表达式,不管a标签下结构多复杂,只要是a标签的都不放过:(最关键的一步)

$pattern = '|<a[^>]*>(.*)</a>|isU';
preg_match_all($pattern, $html, $matches);

匹配的结果在$matches中,它大概是这样的一个多维素组:

array(2) { 
 [0]=> 
 array(*) { 
  [0]=>
  string(*) "完整的a标签"
  .
  .
  .
 }
 [1]=>
 array(*) {
  [0]=>
  string(*) "与上面下标相对应的a标签中的内容"
 }
}

只要能得到这个数据,其他就完全可以操作啦,你可以遍历这个素组,找到你想要a标签,然后获取a标签相应的属性,想怎么操作就怎么操作啦,下面推荐一个类,让你更方便操作a标签:

$dom = new DOMDocument();
 
@$dom->loadHTML($a);//$a是上面得到的一些a标签
 
$url = new DOMXPath($dom);
 
$hrefs = $url->evaluate('//a');
 
for ($i = 0; $i < $hrefs->length; $i++) {
 
 $href = $hrefs->item($i);
 
 $url = $href->getAttribute('href'); //这里获取a标签的href属性
 
}

当然,这只是一种方式,你也可以通过正则表达式匹配你想要的信息,把数据玩出新花样。

得到并匹配得出你想要的结果,下一步当然就是传回前端将他们显示出来啦,把接口写好,然后前端用js获取数据,用jquery动态添加内容显示出来:

var website_url = '你的接口地址';
$.getJSON(website_url,function(data){
 if(data){
  if(data.text == ''){
   $('#article_url').html('<div><p>暂无该文章链接</p></div>');
   return;
  }
  var string = '';
  var list = data.text;
  for (var j in list) {
    var content = list[j].url_content;
    for (var i in content) {
     if (content[i].title != '') {
      string += '<div class="item">' +
       '<em>[<a href="http://' + list[j].website.web_url + '" target="_blank">' + list[j].website.web_name + '</a>]</em>' +
       '<a href=" ' + content[i].url + '" target="_blank" class="web_url">' + content[i].title + '</a>' +
       '</div>';
     }
    }
   }
  $('#article_url').html(string);
});

上最终效果图:

php实现简单爬虫的开发

php实现简单爬虫的开发

PHP 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
动态生成gif格式的图像要注意?
Oct 09 PHP
php连接mysql数据库代码
Mar 10 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
php图片缩放实现方法
Feb 20 PHP
php基于session实现数据库交互的类实例
Aug 03 PHP
PHP编程入门的基本语法知识点总结
Jan 26 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
Smarty模板类内部原理实例分析
Jul 03 PHP
PHP中的异常处理机制深入讲解
Nov 10 PHP
PHP7 其他语言层面的修改
Mar 09 PHP
PHP连接数据库实现注册页面的增删改查操作
Mar 27 #PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 #PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 #PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 #PHP
php用正则判断是否为数字的方法
Mar 25 #PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 #PHP
PHP程序员的技术成长规划
Mar 25 #PHP
You might like
改进的IP计数器
2006/10/09 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python开发常用的一些开源Package分享
2015/02/14 Python
pandas的qcut()方法详解
2019/07/06 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
python对XML文件的操作实现代码
2020/03/27 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
室内设计专业学生的自我评价分享
2013/11/27 职场文书
房产买卖委托公证书
2014/04/04 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
拔河比赛口号
2014/06/10 职场文书
亚运会口号
2014/06/20 职场文书
自查自纠整改报告
2014/11/06 职场文书
关于召开会议的通知
2015/04/15 职场文书
纪检部部长竞选稿
2015/11/21 职场文书