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 操作字符串的惯用手法。
编程的最简单的思路:遇到问题,针对问题提出解决问题的方法,再多个问题总结,得到共同点。
总的来说,就是把面向过程的函数转换成面向对象的类。
相关文章
- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- 有一种方法,可以不打开网站而直接查看到这个网站的源代码.. 这样可以有效地防止误入恶意网站... 在浏览器地址栏输入: view-source:http://...2016-09-20
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- <?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实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
- 本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
- 本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
- 这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
- 其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
- 这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06