好久没写点东西了,有点说不过去了。今天写点前段时间使用rss抓取文章的技术吧,有一些坑,供参考。
使用rss的原因主要是协议统一,各种博客,新闻站点,个人站点的文章内容格式千奇百怪,我无法为它们每个都定制接口进行文章的导入工作,使用rss也就是说这些站点提供统一的接口吐出文章列表,我根据这个接口的格式来抓取文章。
1.simplepie:项目时间有限,所以就没自己写一个rss抓取的工具,当然要写好也还是需要一些时间的。在github上找了半天,最后选择了simplepie,原因是更新比较频繁,最近都还有新的更新,一直都还有人维护。另外功能强大,编码处理啥的,便于应对之后可能遇到的各种新需求。
2.中文编码问题:使用simplepie导入的文章数据会做一个操作,就是将中文字符转成html实体,这样在显示上是没问题的,但是由于是以html实体存储的,导致从文章中抽取摘要信息时,抽取的就是html实体了,在分享到微信,微博的时候就不是中文字符了,所以不能将中文转化成html实体。在google上找了半天,发现是library/Sanitize.php文件中的两行代码的问题,具体说明见http://blog.webfuns.net/archives/1710.html,主要意思就是这两行代码的操作等同于将html代码做了一次重新load,导致中文编码成html实体了,直接注释掉这两句代码就好了。
3.simplepie确实挺好用的,初始化一个对象,设置几个参数,执行初始化函数,就可以获取到文章列表了,代码如下:
//根据rss源初始化rss对象
public static function init($rss_url) {
$feed = new SimplePie();
$feed->set_feed_url($rss_url);
$feed->enable_cache(false);
$feed->init();
$feed->handle_content_type();
return $feed->get_items();
}
4.在获取的文章内容中,根据项目需求做了一些处理,主要抓取分段落的文字内容和图片内容,保存<p><br>标签,另外针对图片需要做特殊处理,保存<img>标签的同时,要通过图片链接地址抓取图片内容并存储。 还需要根据<img>标签进行html的分割处理,这里使用
$content_items = preg_split('/(<img[^>]*>)/i', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
针对除<p><br>以外标签的过滤直接使用
$value = strip_tags($value, "<p><br>");
差不多就这么多吧,项目中用到的就这么多了,基本上大多数对rss抓取的要求都可以满足了,有问题可以留言哈,看到了一定及时回复。