网页数据抓取软件( 如何利用PHP从网页上常见的元数据,以使您将要创造的介绍)
优采云 发布时间: 2022-03-26 12:07网页数据抓取软件(
如何利用PHP从网页上常见的元数据,以使您将要创造的介绍)
您将要创建的介绍
最近,我开始在 Yii 平台上建立一个社区站点,这将是我使用 Yii2 编程系列的一部分。我想让添加与 网站 内容相关的链接变得容易。人们很容易将 URL 粘贴到表单中,但同时提供标题和来源信息也变得很耗时。
在今天的教程中,我将向您展示如何利用 PHP 从网页中抓取通用元数据,以使您的用户更容易参与和构建更有趣的服务。
请记住,我参与了下面的评论线程,所以让我知道您的想法!您也可以在 Twitter @lookahead_io 上与我联系。
入门
首先,我构建了一个供人们粘贴 URL 的表单。我还创建了一个查找按钮来使用 AJAX 请求获取元数据信息来抓取网页。
按 Lookup 通过 ajax 调用 Link::grab() 函数:
$(document).on("click", '[id=lookup]', function(event) {
$.ajax({
url: $('#url_prefix').val()+'/link/grab',
data: {url: $('#url').val()},
success: function(data) {
$('#title').val(data);
return true;
}
});
});
刮页
Link::grab() 代码调用 fetch_og()。这模仿了一个爬虫来捕获页面并使用 DOMXPath 来获取元数据:
public static function fetch_og($url)
{
$options = array('http' => array('user_agent' => 'facebookexternalhit/1.1'));
$context = stream_context_create($options);
$data = file_get_contents($url,false,$context);
$dom = new \DomDocument;
@$dom->loadHTML($data);
$xpath = new \DOMXPath($dom);
# query metatags with og prefix
$metas = $xpath->query('//*/meta[starts-with(@property, \'og:\')]');
$og = array();
foreach($metas as $meta){
# get property name without og: prefix
$property = str_replace('og:', '', $meta->getAttribute('property'));
$content = $meta->getAttribute('content');
$og[$property] = $content;
}
return $og;
}
就我而言,我替换了上面的 og: 标签,但下面的代码会查找各种类型的标签:
$tags = Link::fetch_og($url);
if (isset($tags['title'])) {
$title = $tags['title'];
} else if (isset($tags['metaProperties']['og:title']['value'])) {
$title=$tags['metaProperties']['og:title']['value'];
} else {
$title = 'n/a';
}
return $title;
}
您还可以获取其他标签,如关键字、描述等。jQuery 然后将结果添加到表单以供用户提交:
走得更远
我还有一个源表,稍后会开发。但基本上,每次添加新 URL 时,我们都会将其解析为基础 网站 域并将其放入 Source 表中:
$model->source_id = Source::add($model->url);
...
public static function add($url='',$name='') {
$source_url = parse_url($url);
$url = $source_url['host'];
$url = trim($url,' \\');
$s = Source::find()
->where(['url'=>$url])
->one();
if (is_null($s)) {
$s=new Source;
$s->url = $url;
$s->name = $name;
$s->status = Source::STATUS_ACTIVE;
$s->save();
} else {
if ($s->name=='') {
$s->name = $name;
$s->update();
}
}
return $s->id;
}
现在,我正在手动更新源名称,以便它们在用户看来整洁,例如 ABC News、BoingBoing 和 Vice:
希望在下一集中,我将回顾如何使用免费提供的 API 查找 网站 名称。奇怪的是,没有通用标签。如果只有互联网是完美的。
付费墙网站
一些网站(如《纽约时报》)不允许您抓取元数据,因为它们的付费墙很大。但他们确实有一个 API。由于文档杂乱,学习起来并不容易,但他们的开发人员很快就可以在 GitHub 上提供帮助。我还希望写 文章 关于在以后的节目中使用《纽约时报》头条新闻中的元数据查找。
在结束时
我希望你觉得这个抓取指南很有帮助,并在你的项目中使用它。如果你想看到它的实际效果,你可以在我的 网站Active Together 中尝试一些网络抓取。
请在评论中分享任何想法和反馈。您也可以随时在 Twitter @lookahead_io 上直接与我联系。并确保查看我的讲师页面和其他系列 文章,使用 PHP 构建启动和使用 Yii2 编程。
相关链接
翻译自: