PHP+HTML+JavaScript+Css实现简单爬虫开发


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+HTML+JavaScript+Css实现简单爬虫开发

那么接下来就是功能的实现了,我用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+HTML+JavaScript+Css实现简单爬虫开发

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
ADODB类使用
Nov 25 PHP
PHP开发入门教程之面向对象
Dec 05 PHP
php 变量未定义等错误的解决方法
Jan 12 PHP
PHP学习笔记 (1) 环境配置与代码调试
Jun 19 PHP
探讨GDFONTPATH能否被winxp下的php支持
Jun 21 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
全面了解PHP中的全局变量
Jun 17 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
Yii框架上传图片用法总结
Mar 28 #PHP
Yii开启片段缓存的方法
Mar 28 #PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 #PHP
CI映射(加载)数据到view层的方法
Mar 28 #PHP
CI配置多数据库访问的方法
Mar 28 #PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 #PHP
CI分页类首页、尾页不显示的解决方法
Mar 28 #PHP
You might like
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
JavaScript更改class和id的方法
2008/10/10 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
Antd的table组件表格的序号自增操作
2020/10/27 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
Windows下实现将Pascal VOC转化为TFRecords
2020/02/17 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
体操比赛口号
2014/06/10 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python