使用PHP做网页采集实例过程总结
2013-12-27 00:00
459 查看
最近有个任务是需要我检查一些网站,如果纯手工检查的话,感觉既费时又无聊。所以我就想用采集。思路其实很简单,先把网站的源码采集下来,然后用正则表达式去匹配符合的链接,最后把标题和网址入库、分析。因为我使用最多的是php,所以打算用php做网页采集。
第一步,链接数据库,取出需要检查的网站和正则。
数据库这里我用了postgresql,数据库和表已经按要求建好。因为默认配置的环境是centos系统加nginx、mysql和php,所以首先是配置环境。配置具体不在这里多说,下次总结。环境配置好后在php中用pg_connect连接数据库,这里我连接了两个不同的数据库。
$conn_1=pg_connect("host=xxx.xxx.xxx.xxx port=5432 dbname=mydb1 user=postgres password=xxxxxx") ;
$conn_2=pg_connect("host=xxx.xxx.xxx.xxx port=5432?dbname=mydb2?user=postgres password=xxxxxx") ;
第二步,取出网页源码,对源码进行初步处理。
不同网站编码格式不一样,需要先把编码统一转换成utf-8,不然之后入库会出现乱码。
//获取网页源码
//$url='http://www.sijitao.net/' ;
$str = file_get_contents($url);
//使用preg_match和正则表达式取出编码
$wcharset = preg_match("/<meta.+?charset=[^\w]?([-\w]+)/i",$str,$temp) ? strtolower($temp[1]):"" ;
//编码转换
if($wcharset){
$str=iconv("$wcharset", "UTF-8", $str) ;
}
这里我还使用str_ireplace()函数对取到的源码做了些字符替换,不然最后用正则匹配网址的时候会出现问题。
第三步,匹配处理后的源码字符串,对匹配的数据入库。
从数据库中取出对应的正则,保存在$preg变量,符合正则的数据已数组形式保存在$m。
$pat = "/<a(.*?)href=\"($preg)\"(.*?)>(.*?)<\/a>/is";
preg_match_all($pat, $str, $m);
$cnt=count($m[2]) ;
for($i=0;$i<$cnt;$i++){
if(strip_tags($m[2][$i])){
$url=strip_tags($m[2][$i]) ;
$url=$m[2][$i] ;
}
if(strip_tags($m[4][$i])){
$title=strip_tags($m[4][$i]) ;
}
else{
$title="There's Something Errors!" ;
}
//编写代码,对title和url进行入库操作。
}
}
采集单个网页这样基本上就算完成了。总结,这里其实就用了preg_match(),preg_match_all()和str_ireplace()函数。程序菜鸟,写的不好请见谅。
原文地址:http://www.sijitao.net/1511.html
第一步,链接数据库,取出需要检查的网站和正则。
数据库这里我用了postgresql,数据库和表已经按要求建好。因为默认配置的环境是centos系统加nginx、mysql和php,所以首先是配置环境。配置具体不在这里多说,下次总结。环境配置好后在php中用pg_connect连接数据库,这里我连接了两个不同的数据库。
$conn_1=pg_connect("host=xxx.xxx.xxx.xxx port=5432 dbname=mydb1 user=postgres password=xxxxxx") ;
$conn_2=pg_connect("host=xxx.xxx.xxx.xxx port=5432?dbname=mydb2?user=postgres password=xxxxxx") ;
第二步,取出网页源码,对源码进行初步处理。
不同网站编码格式不一样,需要先把编码统一转换成utf-8,不然之后入库会出现乱码。
//获取网页源码
//$url='http://www.sijitao.net/' ;
$str = file_get_contents($url);
//使用preg_match和正则表达式取出编码
$wcharset = preg_match("/<meta.+?charset=[^\w]?([-\w]+)/i",$str,$temp) ? strtolower($temp[1]):"" ;
//编码转换
if($wcharset){
$str=iconv("$wcharset", "UTF-8", $str) ;
}
这里我还使用str_ireplace()函数对取到的源码做了些字符替换,不然最后用正则匹配网址的时候会出现问题。
第三步,匹配处理后的源码字符串,对匹配的数据入库。
从数据库中取出对应的正则,保存在$preg变量,符合正则的数据已数组形式保存在$m。
$pat = "/<a(.*?)href=\"($preg)\"(.*?)>(.*?)<\/a>/is";
preg_match_all($pat, $str, $m);
$cnt=count($m[2]) ;
for($i=0;$i<$cnt;$i++){
if(strip_tags($m[2][$i])){
$url=strip_tags($m[2][$i]) ;
$url=$m[2][$i] ;
}
if(strip_tags($m[4][$i])){
$title=strip_tags($m[4][$i]) ;
}
else{
$title="There's Something Errors!" ;
}
//编写代码,对title和url进行入库操作。
}
}
采集单个网页这样基本上就算完成了。总结,这里其实就用了preg_match(),preg_match_all()和str_ireplace()函数。程序菜鸟,写的不好请见谅。
原文地址:http://www.sijitao.net/1511.html
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- Java简单字符串插值实现
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- dedecms采集过滤常用代码集合
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- C# 正则判断一个数字的格式是否有逗号的代码
- C#常用正则大全分享
- ASP.NET、ASP、PHP、JSP之间有什么区别?