最近有个抓取网页新闻的任务,做完了总结一下。
一、抓取网页内容
1.方法一:file_get_contents
例:
$list_data = file_get_contents( 'http://dangjian.people.com.cn/GB/394443/index1.html' );
$list_data = mb_convert_encoding($list_data, 'utf-8','GB2312');
echo $list_data;
2.方法二:curl
例:
$url = "http://dangjian.people.com.cn/GB/394443/index.html";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//设置为false以避开ssl证书检查
$res = curl_exec($ch);
echo $res;
curl_close($ch);
二、获取列表
方法:preg_match_all($pattern,$subject,$out)
执行一个全局正则表达式匹配:匹配正则,被搜索字符串,输出的变量
例:
preg_match_all( '/<li><a href=\'(.*?)\' target=_blank>(.*?)<\/a> <i>(.*?)<\/i><\/li>/i', $list_data, $list_data_res );
echo $list_data_res[1];
三、获取标题、内容
a.再使用file_get_contents或者curl方法获取一条新闻详情
b.preg_match:执行一个正则表达式匹配
1.获取标题
例:
preg_match( '/<h1>(.*?)<\/h1>/i', $html_data, $title );
$title = $title[1];
2.获取内容
preg_match( '/<div class="show_text">(.*?)<\/div>/i', $html_data, $content );
$content = $content[0];
四、Tip
1.当我第一次抓取列表内容时,发生了乱码,使用mb_convert_encoding解决
2.我在抓取内容的时候,一直都抓取不到,后来发现html源文件由于换行符、制表符、回车等的存在会造成无法匹配,使用preg_replace解决
3.匹配tip
a.注意/一定要被转义成\/,单引号也需要转义
b.正则表达式用单引号'和/作为开始和结束的标界
c.换行符、制表符、回车等等的存在会造成无法匹配
4.使用preg_match和preg_match_all的区别
preg_match只匹配一次
preg_match_all是全文匹配,即所有跟表达式一致的都找出来。
5.preg_replace():执行一个正则表达式的搜索和替换
参考网址:https://www.runoob.com/php/php-preg_replace.html
例:
$string = 'google 123, 456';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = 'runoob ${2},$3';
echo preg_replace($pattern, $replacement, $string);
结果:
runoob 123,456
五、附上源码
抓取demo:
public function testArticle(){
$url = "http://dangjian.people.com.cn/GB/394443/index.html";//网址
$list_data = Helper::curl_get($url);
$list_data = mb_convert_encoding($list_data, 'utf-8','GB2312');//所有内容
preg_match_all( '/<li><a href=\'(.*?)\' target=_blank>(.*?)<\/a> <i>(.*?)<\/i><\/li>/i', $list_data, $list_data_res );
$link = $list_data_res[1][0];//列表中其中一个链接
$content_url = "http://dangjian.people.com.cn{$link}";//内容页地址
$html_data = Helper::curl_get($content_url);
$html_data = mb_convert_encoding($html_data, 'utf-8','GB2312');//解决乱码问题
preg_match( '/<h1>(.*?)<\/h1>/i', $html_data, $title );
$title = $title[1];//标题
print_r($title);
$html_data=preg_replace("/[\t\n\r]+/","",$html_data);//解决符号影响无法匹配
preg_match( '/<div class="show_text">(.*?)<\/div>/i', $html_data, $content );//内容
$content = $content[0];
print_r($content);
}
curl方法:
public static function curl_get( $url ){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//设置为false以避开ssl证书检查
$res = curl_exec($ch);
curl_close($ch);
return $res;
}