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 相关文章推荐
PHP新手上路(十)
Oct 09 PHP
PHP的面试题集
Nov 19 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
PHP多文件上传实例
Jul 09 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP实现上传多文件示例代码
Feb 20 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 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
apache php模块整合操作指南
2012/11/16 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
php中的动态调用实例分析
2015/01/07 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
document.documentElement的一些使用技巧
2013/04/18 Javascript
Javascript Objects详解
2014/09/04 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
Python学习教程之常用的内置函数大全
2017/07/14 Python
python difflib模块示例讲解
2017/09/13 Python
MAC中PyCharm设置python3解释器
2017/12/15 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
python多线程与多进程及其区别详解
2019/08/08 Python
python创建学生管理系统
2019/11/22 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
Python关于反射的实例代码分享
2020/02/20 Python
入党自我鉴定范文
2013/10/04 职场文书
影视制作岗位职责
2013/12/04 职场文书
投标单位介绍信
2014/01/09 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
实习生矿工检讨书
2014/10/13 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS