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 相关文章推荐
php microtime获取浮点的时间戳
Feb 21 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
PHP性能优化 产生高度优化代码
Jul 22 PHP
php递归创建和删除文件夹的代码小结
Apr 13 PHP
基于PHP服务端图片生成缩略图的方法详解
Jun 20 PHP
PHP程序员基本要求和必备技能
May 09 PHP
php 魔术方法详解
Nov 11 PHP
php批量删除操作(数据访问)
May 23 PHP
PHP convert_cyr_string()函数讲解
Feb 13 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
用js实现in_array的方法
2013/11/05 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JavaScript奇技淫巧44招【实用】
2016/12/11 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python k-近邻算法实例分享
2014/06/11 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
详解python3实现的web端json通信协议
2016/12/29 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
python脚本开机自启的实现方法
2019/06/28 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
服务型党组织建设典型材料
2014/05/07 职场文书
工作建议书范文
2014/05/13 职场文书
督导岗位职责范本
2015/04/10 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python