网页抓取数据 免费( 如何利用PHP从网页中抓取通用元数据,以使您的用户更容易参与并构建更有趣的服务)
优采云 发布时间: 2022-03-09 12:13网页抓取数据 免费(
如何利用PHP从网页中抓取通用元数据,以使您的用户更容易参与并构建更有趣的服务)
如何从网页中抓取元数据
介绍
我最近开始在 Yii 平台上建立一个社区站点,我很快就会在我的 Programming With Yii2 系列中写到。我想让添加与 网站 内容相关的链接变得容易。虽然人们很容易将 URL 粘贴到表单中,但同时提供标题和来源信息会变得很耗时。
在今天的教程中,我将向您展示如何利用 PHP 从网页中抓取通用元数据,以使您的用户更容易参与和构建更有趣的服务。
请记住,我参与了下面的评论线程,所以让我知道您的想法!您也可以在 Twitter @lookahead_io 上与我联系。
入门
首先,我构建了一个表单,供人们通过粘贴 URL 来添加链接。我还创建了一个查找按钮来使用 AJAX 请求元数据信息来抓取网页。
通过 ajax 调用函数,如 LookupLink::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 上提供帮助。我还希望写 文章 来介绍使用元数据在以后的剧集中找到 NYT 的头条新闻。
当它结束时
我希望你觉得这个抓取指南很有帮助,并在你的项目中使用它。如果你想看到它的实际效果,你可以在我的 网站 Active Together 上尝试一些网络抓取。
请在评论中分享任何想法和反馈。您也可以随时在 Twitter @lookahead_io 上直接与我联系。请务必查看我的讲师页面和我的其他系列,使用 PHP 构建您的初创公司和使用 Yii2 编程。
相关链接