php 抓取新浪新闻的程序代码

 更新时间:2016年11月25日 15:36  点击:1288
抓取就是采集了,今天因为我们要做一个实时采集新浪新闻的功能,下面整理了一个非常了得的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定时任务通过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);

  

?>

在手机中使用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)来判断匹配是否成功。

字符串与数字转换的前提是字符串为数字型否则就会转成0了,下面我们要介绍的是像0001000我们要转成1000,00这种,下面来看看。

PHP 是一门脚本语言,但它很神奇,你用POST一串数字过去,用var_dump()打印出来,你会发现,这串数字的格式是string。

今天,我要做一个功能,把12位数字,如:000000100000

像上面这种以分为单位的数字,一般人看起来很麻烦,所以,我们要处理一下显示成如下的样子


像这样,就看起来方便一点。要怎么处理,我本打算用正则,但/d 是匹配出0-9的数字,我要从新写匹配方式,再三反思,还是用

简单的方式

function transAmt($value)

 

{

 

//将字符串转换成数组

 

$array = str_split($value);

 

//对数组进行遍历

 

foreach($array as $key=>$va)

 

{

 

if($va != 0)

 

{

 

$start = $key;

 

break;

 

}

 

}

//对字符串组进行分割

$len = strlen($value) - $start;

$substr =  substr($value,$start,$len);

 //对数据进行处理,先获取子串的长度

  $smallnum = substr($substr,-2,2);

   $bignum = substr($substr,0,$len-2);

   return $bignum.".".$smallnum;

 }

这样就完事了,就是把字符串转换成数组,再操作数组。

这应该算是PHP 操作字符串的惯用手法。

编程的最简单的思路:遇到问题,针对问题提出解决问题的方法,再多个问题总结,得到共同点。

总的来说,就是把面向过程的函数转换成面向对象的类。

 

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06