php 获取网页标题(并解决编码问题)

赞赏 2017-06-02

用python做过爬虫,爬虫最让人头痛的问题主要有:网页编码、抓取效率、源站反爬策略,网页千千万,不同地区的网站使用的编码有时会不一样,当然了,即使同一个网站,也有可能使用了 gbk和utf-8两种或多于两种的编码,这完全取决于网页制作者的喜好,有时制作人员采用的编辑器,一个疏忽也会导致编码问题。


闲暇中,恰好手边没什么事,博客也该更新一下了,使用php获取网页的标题[title]部分,注意是title部分,这涉及到编码获取、编码转换及正则的使用。当然,这只是一个简单的方法,获取https协议的网页中会遇到麻烦。

下面的代码肯定是经不起网站的反爬策略,也不能用它完成一些高难度任务——比如处理coockies、验证、表单提交、文件上传等。要高度定制爬虫,更好的解决方案是使用 php 的cURL库,cURL 是一种功能强大的库,支持很多不同的协议、选项,能提供 URL 请求相关的各种细节信息,后话,暂且不讨论。

本文的目的只是讲述了一个获取网页标题的流程:访问URL->获取网页内容->使用正则提取标题->编码检测与转换->显示结果.


版本1 文件:class.Html.php:


<?php
/**
* User: jinaYang
* blog: yangshengliang.com
* Date: 2016/11/1
* Time: 18:53
*/

namespace php\spider;

class Html
{
public function getTitle() {
$url = "http://jd.com";
$f = file_get_contents($url);
preg_match('/<title>(?<title>.*?)<\/title>/si', $f, $title); //获取title的正则表达式
$encode = mb_detect_encoding($title['title'], array('GB2312','GBK','UTF-8', 'CP936')); //得到字符串编码
$file_charset = iconv_get_encoding()['internal_encoding']; //当前文件编码
if ( $encode != 'CP936' && $encode != $file_charset ) {
return iconv($encode, $file_charset, $title['title']);
}
return $title['title'];
}
}
$title = new Html();
echo $title ->getTitle();
?>

得到结果,已经达到目的:

京东(JD.COM)-综合网购首选-正品低价、品质保障、配送及时、轻松购物!

美中不足:虽然得到了正确的结果,但是每次抓取一个网页的标题,都需要更改源代码。能不能再智能化一点?答案是肯定的,采用get方法,传入相应的 url值作为getTitle()的参数。需要采集某网页的标题时,直接在地址栏修改url地址就可以了。


版本2 文件:class.Html.php


<?php
/**
* User: jinaYang
* blog: yangshengliang.com
* Date: 2016/11/1
* Time: 18:53
*/

namespace php\spider;
header("Content-type:text/html;charset=utf-8");

class Html
{
public function getTitle($url) {
$f = file_get_contents($url);
preg_match('/<title>(?<title>.*?)<\/title>/si', $f, $title);
$encode = mb_detect_encoding($title['title'], array('GB2312','GBK','UTF-8', 'CP936')); //得到字符串编码
$file_charset = iconv_get_encoding()['internal_encoding']; //当前文件编码
if ( $encode != 'CP936' && $encode != $file_charset) {
return iconv($encode, $file_charset, $title['title']);
}
return $title['title'];
}
}
$title = new Html();
echo $title ->getTitle($_GET['url']);
?>


登陆后阅读全文
阅读 1750 赞赏 0 有用 4 没用 2 收藏 0 分享

   



0 条留言

匿名

事了拂衣去 深藏身与名

相关文章

Linux php-fpm报错:allow_call_time_pass_reference

如何配置php显示错误信息?

6款程序员必备的开源中文汉字拼音转换及处理工具 (PHP Java .net)

PHP Fatal error: Allowed memory size of bytes exhausted

Linux 服务器如何隐藏 PHP 版本号?

PHP 程序无法识别短标签

改了php.ini中的open_basedir仍报错open_basedir restriction in effect

原来这条命令可以让我们快速找到php.ini的位置

php call_user_fun Call-time pass-by-reference has been remov

php.ini 设置了 error_log 为什么不生效?

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

手机扫一扫
分享文章