根据前几篇的博文:
curl数据采集系列之单页面采集函数get_html
curl数据采集系列之多页面并行采集函数get_htmls
curl数据采集系列之正则处理函数get_matches
可以得到了单页面和多页面的采集功能 如下:
1 $urls = array('http://www.baidu.com','http://www.hao123.com');
2 $htmls = get_htmls($urls);
3 foreach($htmls as $html){
4 $matches = get_matches('!<a[^<]+</a>!',$html,'没有找到链接',true);
5 if($matches){
6 var_dump($matches);
7 }
8 }
这样不管是如何采集 最后都是处理一个html页面
数据采集的过程经常要深入好几层的页面 得到想要的数据 如论坛:
先采集论坛的列表页 再通过列表页采集到的地址 进入内容页
循环层次太多 代码不好维护 管理 既然是列表页和内容页 的采集规则不一样 把他们分出来成为两个函数
1 $urls = array(列表页网址1,列表页网址2,列表页网址...);
2 $htmls = get_htmls($urls);
3 foreach($htmls as $html){
4 $list_urls = get_list_urls($html);
5 $contents_htmls = get_htmls($list_urls);
6 foreach($contents_htmls as $c_html){
7 contents_exec($c_html);
8 }
9 }
10 function get_list_urls($html){
11 //处理列表页内容 得到下一层网址
12 return 得到的网址数组;
13 }
14 function contents_exec($html){
15 //处理内容页 插入数据库等等....
16 }
但是这样如果层次更多 循环结构还是会很绕 那么就把这种循环规律 写成一个web_spider函数
1 function web_spider($urls,$func,$chunk_num,$options = array(),$method = 'get'){
2 //$urls 网址数组
3 //$func 函数名字符串
4 //$chunk_num 一次并行采集的页数
5 //因为使用get_htmls 所以$options $method 不可少
6 $urls_chunk_array = array_chunk($urls,$chunk_num,true);
7 foreach($urls_chunk_array as $urls){
8 $htmls = get_htmls($urls,$options,$method);
9 foreach($htmls as $key=>$html){
10 $func($html,$key);
11 }
12 }
13 }
那么代码编写如下:
1 $urls = array(列表页网址1,列表页网址2,列表页网址...);
2 web_spider($urls,'get_list_urls',10);
3 function get_list_urls($html,$key){
4 //$key 是为了判断哪个页面
5 //处理列表页内容 得到下一层网址
6 web_spider(得到的网址数组,'contents_exec',10);
7 }
8 function contents_exec($html,$key){
9 //$key 是
http://101ban.sinaapp.com/guest/show/2 这是一个网站留言板的分页页面,show方法后面的参数应该是数字,但是如果人为输入一些字符串,就会导致数据库错误,通过分析错误页面的报错信息,可以通过输入数据库sql命令操作数据库,给网站安全带来威胁。因此,不仅用户输入的信息要过滤,很多自带的参数也要进行过滤,防止出现安全问题。
分页代码如下:
$this->load->library ( 'pagination' );
$config ['base_url'] = site_url () . '/guest/show';
$config ['total_rows'] = $c;
$config ['per_page'] = $pernum = 15;
$config ['uri_segment'] = 3;
$config ['use_page_numbers'] = TRUE;
$config ['first_link'] = '第一页';
$config ['last_link'] = '最后一页';
$config ['num_links'] = 5;
$this->pagination->initialize ( $config );
if (! $this->uri->segment ( 3 )) {
$currentnum = 0;
} else {
$currentnum = is_numeric($this->uri->segment ( 3 ))?(intval($this->uri->segment ( 3 ) - 1)) * $pernum:0;
}
$current_page=is_numeric($this->uri->segment ( 3 ))?intval($this->uri->segment ( 3 )):1;
if($current_page){
$data ['title'] = '第'.$current_page.'页-留言本-大冶实验高中首届宏志班网站';
}
else{
$data ['title'] = '留言本-大冶实验高中首届宏志班网站';
}
$data ['liuyan'] = $this->ly->getLy ( $pernum, $currentnum );
其中:
$current_page=is_numeric($this->uri->segment ( 3 ))?intval($this->uri->segment ( 3 )):1;
$currentnum = is_numeric($this->uri->segment ( 3 ))?(intval($this->uri->segment ( 3 ) - 1)) * $pernum;
这两句判断了参数是否为数字。防止非法字符输入。
本文链接
apache mod_rewrite模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
使用此模块的条件
1.在apache的httpd.conf里开启LoadModule rewrite_module modules/mod_rewrite.so即把前面的 ‘#’去掉
如果有操作httpd.conf的权限可以直接在httpd.conf里配置,但多是在网站目录下.htaccess文件里配置
如果在.htaccess里配置需开启支持.htaccess
AllowOverride All使.htaccess文件生效
1 <Directory>
2 Options indexes FollowSymlinks
3 AllowOverride All
4 Order allow,deny
5 Allow from all
6 </Directory>
第二行有indexes的话是允许列出目录文件,没有或者-indexes则表示不允许列出目录文件
示例目录结构
re在apache根目录下
re下demo文件
1 <?php
2 echo $_GET['id'];
3 echo "<br/>";
4 echo "re下的demo<br/>";
5 echo "<hr/>";
6 echo $_SERVER['PHP_SELF'];
7 ?>
r1,r2下demo和demo一样,只是第四行分别为"r1下demo","r2下demo"标志
error.html文件里代码也只是标志各自位置
.htaccess文件
1 <IfModule rewrite_module>
2 RewriteEngine On
3 RewriteBase /re/
4
5 RewriteCond %{HTTP_HOST} localhosT [NC]
6 RewriteRule demo(\d+)\.html demo.php?id=$1
7
8 ErrorDocument 404 error.html
9 </Ifmodule>
其中RewriteBase+demo.php是真实文件存在位置,如果没设置此项则以.htaccess文件所在目录为基准
如果按以上的.htaccess
访问:http://localhost/re/demo1.html
结果:
要访问的demo1.html是以.htaccess所在目录为基准
访问个不存在的目录里的http://localhost/re/a/demo1.html
将会访问到当前RewriteBase下的error.html文件
若
若 改为:RewriteBase /re/r1
若:
当不匹配时
ErrorDocument 404 error.html
去找当前RewriteBase 下的error.html
RewriteCond %{HTTP_HOST} localhosT [NC]
这句时匹配前的判断条件
如果%{HTTP_HOST} 是localhost就进行下面的RewriteRule
[NC]表示不区分大小写
注意localhosT,[NC]两者之间有空格
本文只是作些简单的实例演示,更多内容请查看apace手册相关内容!
本文链接