网页抓取数据 免费( 如何利用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 编程。

  相关链接

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线