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 相关文章推荐
一次编写,随处运行
Oct 09 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
php使用json_encode对变量json编码
Apr 07 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
必须收藏的php实用代码片段
Feb 02 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
CakePHP框架Model函数定义方法示例
Aug 04 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
Laravel 不同生产环境服务器的判断实践
Oct 15 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
smarty简单应用实例
2015/11/03 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
jQuery html()等方法介绍
2009/11/18 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
实例解析jQuery插件EasyUI最常用的表单验证规则
2015/11/29 Javascript
plupload+artdialog实现多平台上传文件
2016/07/19 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
JS实现容器模块左右拖动效果
2020/01/14 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python操作redis方法总结
2018/06/06 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python数组并集交集补集代码实例
2020/02/18 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
详解python内置模块urllib
2020/09/09 Python
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
致百米运动员广播稿
2014/01/29 职场文书
大学军训感言300字
2014/03/09 职场文书
慈善晚会策划方案
2014/05/14 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书