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中使用Oracle数据库(5)
Oct 09 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
基于empty函数的输出详解
Jun 17 PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
php解析xml 的四种简单方法(附实例)
Jul 11 PHP
微信支付开发告警通知实例
Jul 12 PHP
总结PHP中数值计算的注意事项
Aug 14 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
Jun 30 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 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
JS实现php的伪分页
2008/05/25 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
学习Vue组件实例
2018/04/28 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python人人网登录应用实例
2014/09/26 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
python解析基于xml格式的日志文件
2017/02/25 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
python regex库实例用法总结
2021/01/03 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
serialVersionUID具有什么样的特征
2014/02/20 面试题
清明节扫墓活动方案
2014/03/02 职场文书
授权委托书格式
2014/07/31 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
解决 redis 无法远程连接
2022/05/15 Redis
关于mysql中string和number的转换问题
2022/06/14 MySQL