PHP定时任务通过CURL图片的抓取例子

 更新时间:2016年11月25日 15:36  点击:1696
下文为各位介绍一个PHP定时任务通过CURL图片的抓取例子,希望例子对大家帮助。

基本思路就是通过一个URL连接,将所有图片的地址抓取下来,然后循环打开图片,利用文件操作函数下载下来,保存到本地,并且

把图片的alt属性也抓取下来,最后将数据保存到自己数据库。

废话不多说,看程序就能明白了,其中,需要用到PHP定时任务和PHP的一个第三方插件simple_html_dom.php,的使用,参考simple_html_dom的下载和使用

代码:

<?php

  function getLink($url){

    include_once('simple_html_dom.php');

    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url);

    curl_setopt($ch,CURLOPT_HEADER,false);

    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

    $output = curl_exec($ch);

    curl_close($ch);

    $html = new simple_html_dom();

    $html->load($output);

 $links = array();

    $arr = array();

 $title = array();

    foreach($html->find('a') as $element){

      if( preg_match('#^\/content_[0-9]+_1\.html$#i',$element->href)){

            array_push($links,'http://www.111cn.net'.$element->href);

   array_push($title,$element->title);

  }

  

 } 

 $links = array_values(array_unique($links));

 $title = array_values(array_unique($title));

 $arr['links'] = $links;

 $arr['title'] = $title;

 return $arr;

  }

  

  function loadimg($url,$dirname){ 

  include_once('simple_html_dom.php');

  $ch = curl_init();

  curl_setopt($ch,CURLOPT_URL,$url);

  curl_setopt($ch,CURLOPT_HEADER,false);

  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

  $output = curl_exec($ch);

  curl_close($ch);

  $html = new simple_html_dom();

  $html->load($output);

  $arr = array();

  foreach($html->find('img[w]') as $element){

    $image =  $element->src; 

  }

  $data = file_get_contents($image);

   $info = getimagesize($image);//获取图片信息,大小,格式

   switch($info[2]){

     case 1:

       $str = 'gif';

       break;

     case 2:

       $str = 'jpg';

       break;

     case 3:

       $str = 'png';

       break;

     default:

       continue;

       break;

   }

   if($info[1] < 10 || $info[0] < 10) continue;//图片太小,不是有价值的图片,跳过本次循环

   $filename = time().rand(1,999999).'.'.$str; 

   if(!is_dir($dirname)){

     mkdir($dirname,0777,true);

   }

   $fp = fopen($dirname.$filename,'w');

   fwrite($fp,$data);

   fclose($fp);

   return $dirname.$filename;

   

}

  do{

    set_time_limit(0);

    ignore_user_abort();

    $img = getLink('http://www.111cn.net /qutu_1.html');

    $count = count($img['links']);

    $arr = array();

    for($i=0;$i<$count;$i++){

   $arr[]=loadimg($img['links'][$i],'images/');

    }

    $img['url'] = $arr;

    echo '<br/>';

    $img['title'];

    $res = array();

    $len = count($img['title']);

    //重新将数据组装成我们常用的二维数组,方便数据的数据库处理

    for($i=0;$i<$len;$i++){

      $res[$i]['title'] = $img['title'][$i];

   $res[$i]['url'] = $img['url'][$i];

    }

    foreach($res as $item){

      echo '<img src='.$item["url"].'>'.$item["title"].'<br />';

 

    }

    $interval = 24*3600;

    sleep($interval);

   }while(true);

  

?>

静态化页面可以减少服务器的一个负载了,如果我们同样的一台机器如果有数据库连接只能负载100IP,那么用静态htm文件估计可以负载1000IP,所以我们很多站都是静态化的页面这也是主要的原因了,下面一看一个关于php页面静态化原理与例子。

每一个web项目,在日PV量达到十万级或百万级抑或更高时,你的网站响应速度就决定你的项目是能够继续活下去,或立马死掉的关键

除了升级服务器配置,优化代码,优化数据库之外,另一个技术?页面静态化,也是你不得不采用的技术

我们知道,页面在输出之前,会将输出数据暂时存放到BUFFER(缓冲器)中,然后才会输出到页面;所以,BUFFER中的数据,
就是你PHP代码执行,并且模板渲染之后,所生成的静态数据,即html页面;对于数据更新不是很快,或者页面信息实时性要求
不是很高的时候,我们可以将BUFFER的数据写入到一个html文件中,下次访问时,直接请求这个html页面,这样,中间就免去了PHP代码执行时间,
数据库数据查询时间以及模板渲染的时间,对于数据库I/O量大的页面,能很大地提高页面的响应速度

具体实现如下:

*/
/**
* 这里是你的PHP逻辑代码
*/
//在你页面所有输出内容之前,开启缓冲器
ob_start();
echo ‘hello,word!’
//当使用ob_start()函数之后,页面不会有输出,此时,所有的输出都已经存放在缓存器中
//然后我们将缓存器里面的内容拿出来,存放到一个静态的Html文件中
file_put_contents(‘index.html’,ob_get_contents());//函数ob_get_contents()表示取出当前缓冲器内容;
//然后关闭缓冲器并清除缓冲器内容
ob_end_clean();
/*这样,一个静态的html文件就生成了,然后,需要做的只是判断什么时候该生成html文件,什么时候直接访问Html文件
提示:通过filemtime()函数判断Index.html文件的上次修改时间和当前时间间隔,来控制缓存有效期:
*/
//设置换成有效期为120秒
$cacheTime = ‘120’;
if(time()-filemtime(‘index.html’)>$cacheTime){
//不在缓存有效期,重新生成缓存文件
//这里是你的PHP逻辑代码和生成缓存文件的代码
}else{
//在缓存有效期内,直接调用index.html文件
}

抓取就是采集了,今天因为我们要做一个实时采集新浪新闻的功能,下面整理了一个非常了得的php 抓取新浪新闻的程序,我们来看看。


首先,需要下载一个simple_html_dom第三方扩展库,具体下载方式和使用详情可以查看:simple_html_dom的使用.

需要环境支持file_get_contents()函数和curl的支持,具体代码如下:

<?php 

function timingimg($url,$dirname,$interval){

  ignore_user_abort(); //浏览器关闭,程序继续执行

  set_time_limit(0);//忽略到默认30秒超时

  $interval = empty($interval)?3600:$interval;

  $dirname = empty($dirname)?'news/':$dirname;

  if(empty($url)){

    die('请输入目标网址!!!');

  }

  do{

    $arr = loadimg($url,$dirname);

 return $arr;    //返回抓取内容所保存的路径

 sleep($interval);

 die;

  }while(true);

}

 

 

/**

*获取所有新闻链接

*参数 $url  新闻列表地址

*参数 $dirname 新闻图片保存路径

* 返回 二维数组  所有新闻记录

*/

function loadimg($url,$dirname){ 

  set_time_limit(0);

  include_once('simple_html_dom.php');

  $ch = curl_init();

  curl_setopt($ch,CURLOPT_URL,$url);

  curl_setopt($ch,CURLOPT_HEADER,false);

  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

  $output = curl_exec($ch);

  curl_close($ch);

  $html = new simple_html_dom();

  $html->load($output);

  $images = array();

  $arr = array();

  foreach($html->find('li  a') as $element){

 

    if( preg_match('#^http:\/\/tech\.sina\.com\.cn\/it\/[\d]{4}\-[\d]{1,2}\-[\d]{1,2}\/[\d]+\.shtml$#i',$element->href)){

   array_push($images,$element->href);

  }

 }

  $images = array_unique($images);

  

  sort($images);

  for($i=0;$i<10;$i++){  //只抓取10条记录

   $arr[] = getcontent($images[$i],$dirname);

 }

  return $arr; 

}

 

/**

*

*

* 抓取单个新闻内容

*参数  $url 新闻页面地址

*参数  $dirname 图片保存路径

*返回 一个新闻记录 一维数组

*/

function getcontent($url,$dirname){

 include_once('simple_html_dom.php');

 $html = new simple_html_dom();

 $data = file_get_contents($url);

 $html->load($data);  

    $arr = array();

    foreach($html->find('h1#artibodyTitle') as $element){

    $arr['title']= @iconv('gbk','utf-8', $element->innertext);

;

   }

   $str = '';

   foreach($html->find('div#artibody p') as $element){

    $str.= $element;      

   }

   $arr['content'] = $str;

   foreach($html->find('div.img_wrapper img') as $element){

      $arr['alt'] =$element->alt;

      $data = file_get_contents($element->src);

      $info = getimagesize($element->src);//get image information

      switch($info[2]){

        case 1:

       $str = 'gif';

       break;

        case 2:

       $str = 'jpg';

       break;

        case 3:

       $str = 'png';

       break;

        default:

       continue;

       break;

      }

      $filename = time().rand(1,999999).'.'.$str; 

      if(!is_dir($dirname)){

        mkdir($dirname,0777,true);

      }

      $fp = fopen($dirname.$filename,'w');            

      fwrite($fp,$data);

      fclose($fp);

      $arr['img'] = $dirname.$filename;

      

    }

   return $arr;

}

?>

如果大家有更好的建议,欢迎提出来

在手机中使用PHP接口与web对接时我们会做一个加密的值进行握手验证了,下面我们就来为各位介绍一些方法与原理了。

方法一,固定一个值,如md5('www.111cn.net') 然后把生成的字符在url或post传递时进行验证


方法二,稍微复杂点双方约定好生成的格式


下面例子www.111cn.net简单讲解PHP接口开发加密技术:

如app要请求用户列表,api是“index.php?module=user&action=list”

app生成token = md5sum (‘user’.’2012-11-28′.’www.111cn.net’.list) = 880fed4ca2aabd20ae9a5dd774711de2;

则实际发起请求为 “index.php?module=user&action=list&token=880fed4ca2aabd20ae9a5dd774711de2”

服务器端接到请求用同样方法计算token:

$module = $_GET['module'];

$action = $_GET['action'];

$token = md5sum($module.date('Y-m-d',time()).'www.111cn.net'.$action);

if($token != $_GET['token']){

    alarm('access deny');

    exit();

}

这样就判断了请求url参数是合法的,允许访问。关键是接口token参数的构造。

还有一种方法用到cookie,这种情况则不适用于读取接口数据的应用场景,适合在浏览器中访问接口。

1.请求头里带用户username和password,到服务器端做验证,通过才继续下边业务逻辑。

优点:防止了服务器端api被随意调用。
缺点:每次都交互用户名和密码,交互量大,且密码明文传输不安全。

2.第一次请求,要求username和password,验证通过,种cookie到客户端,app保存cookie值。

每次请求带上cookie。

点评:和pc上浏览器认证的原理一样了。

strpos() 函数返回字符串在另一个字符串中第一次出现的位置了,但是我们在按官方的手册来测试时发现一直返回false了,那么要如何来解决

STRPOS用法

strpos(string,find,start)

我们看看strpos的一段代码:

//ajax获取分词
public function get_segment_words() {
 $title = I('title');
 $content = I('content');
 $Segment = M('Segment');
 $Segment_content = M('Segment_content');
 $segment_array = $Segment->getField('id,word');
 $setment_words = array();
 foreach ($segment_array as $id => $word) {
  if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
   $segment_words[] = $word;
  }
 }
 $segment_words = array_unique($segment_words);
 $segment_words = implode(',', $segment_words);
 echo $segment_words;exit; //ajax获取填充
}

注意这句代码:

if (false !== strpos($content, $word) || false !== strpos($title, $word)) {
//TODO
}

如果匹配失败,strpos会返回bool类型的false,这个一定要注意。不然会出现什么情况呢?假如你要匹配的字符正好在第一个位置,对于strpos这个函数来说返回的是0,也就是位置0.这个时候实际上是匹配到了,结果返回0,如果这样判断就错了:

if (!strpos($content, $word))

举个例子:

内容:购物袋范德萨法拉点撒范德萨。

匹配:购物

如果要找内容里面是否有“购物”两个字,strpos会返回0,表示存在“购物”两个字,位置是0.

因此要用false!=strpos($find,$content)来判断匹配是否成功。

[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Photoshop古装美女图片转为工笔画效果制作教程

    今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮

    jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • Photoshop枪战电影海报图片制作教程

    Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
  • python opencv通过4坐标剪裁图片

    图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
  • 使用PHP下载CSS文件中的图片的代码

    共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • PHP swfupload图片上传的实例代码

    PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
  • ps怎么制作图片阴影效果

    ps软件是现在很多人比较喜欢的,有着非常不错的使用效果,这次文章就给大家介绍下ps怎么制作图片阴影效果,还不知道制作方法的赶紧来看看。 ps图片阴影效果怎么做方法/...2017-07-06
  • C#中图片旋转和翻转(RotateFlipType)用法分析

    这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • OpenCV如何去除图片中的阴影的实现

    这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • JavaScript 如何禁止用户保存图片

    这篇文章主要介绍了JavaScript 如何禁止用户保存图片,帮助大家完成需求,更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2020-11-19
  • C#将图片和字节流互相转换并显示到页面上

    本文主要介绍用C#实现图片转换成字节流,字节流转换成图片,并根据图片路径返回图片的字节流,有需要的朋友可以参考下...2020-06-25
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25