分层/页面元数据

获取互联网上任何URL的详细信息!用于HTML、OpenGraph、Schema数据的抓取器

2.0.1 2020-11-29 16:08 UTC

This package is auto-updated.

Last update: 2024-09-29 05:01:52 UTC


README

页面元数据 是一个PHP库,可以从互联网上的任何URL获取详细信息!它使用HTML元标签和OpenGraph数据,并在需要时回退到详细的HTML抓取。

亮点

  • 适用于互联网上的任何有效URL!
  • 遵循页面重定向
  • 使用所有可用的抓取方法:HTML标签、OpenGraph、Schema数据

潜在用途

  • 在文章中显示链接的信息卡
  • 消息应用中的链接丰富预览
  • 从用户提交的URL中提取信息

layered-page-meta-link-card

如何使用

安装

layered/page-meta 添加到您的项目 composer.json 文件中的依赖项

$ composer require layered/page-meta

用法

创建一个 UrlPreview 实例,然后使用您的URL作为第一个参数调用 loadUrl($url) 方法。使用 get($section)getAll() 方法检索预览数据

require 'vendor/autoload.php';

$preview = new Layered\PageMeta\UrlPreview([
	'HTTP_USER_AGENT'	=>	'Mozilla/5.0 (compatible; YourApp/1.0; +https://example.com)'
]);
$preview->loadUrl('https://www.instagram.com/p/BbRyo_Kjqt1/');

$allPageData = $preview->getAll();	// contains all scraped data
$siteInfo = $preview->get('site');	// get general info about the website

幕后

该库下载您提供的URL的HTML源代码,然后使用专门的抓取器提取信息片段。核心抓取器可在 src/scrapers/ 中找到,并提取页面的通用信息:标题、作者、描述、页面类型、主要图像等。如果您想提取新的字段,请参阅扩展库部分。

用户代理或额外的标头在下载网站上的HTML时可能产生重大影响。有一些网站禁止抓取,并在检测到此类工具时隐藏内容。请确保阅读他们的开发文档和TOS。

默认用户代理已在Twitter、Instagram、Facebook和其他网站上被阻止。一种解决方案是使用以下用户代理(感谢PVGrad的建议)

'HTTP_USER_AGENT' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'

返回的数据

返回的数据将是一个具有以下格式的 Array

{
	"site": {
		"secure":		true,
		"url":			"https:\/\/www.instagram.com",
		"icon":			"https:\/\/www.instagram.com\/static\/images\/ico\/favicon-192.png\/b407fa101800.png",
		"language":		"en",
		"responsive":	true,
		"name":			"Instagram"
	},
	"page": {
		"type":			"photo",
		"url":			"https:\/\/www.instagram.com\/p\/BbRyo_Kjqt1\/",
		"title":		"GitHub on Instagram",
		"description":	"There\u2019s still time to join the #GitHubGameOff and build a game inspired by throwbacks. Get started\u2026",
		"image":		{
			"url": "https:\/\/scontent-mad1-1.cdninstagram.com\/vp\/73b1790d77548031327e64ee83196706\/5B4AD567\/t51.2885-15\/e35\/23421974_1768724519826754_3855913942043852800_n.jpg"
		}
	},
	"author": {
		"name":			"GitHub",
		"handle":		"@github",
		"url":			"https:\/\/www.instagram.com\/github\/"
	},
	"app_links": {
		"ios": {
			"url": "nflx:\/\/www.netflix.com\/title\/80014749",
			"app_store_id": "363590051",
			"app_name": "Netflix",
			"store_url": "https:\/\/itunes.apple.com\/us\/app\/Netflix\/id363590051"
		},
		"android": {
			"url": "nflx:\/\/www.netflix.com\/title\/80014749",
			"package": "com.netflix.mediaclient",
			"app_name": "Netflix",
			"store_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.netflix.mediaclient"
		}
	}
}

有关每个返回字段的详细信息,请参阅UrlPreview::getAll()

公共API

UrlPreview 类提供了以下公共方法

__construct(array $headers): UrlPreview

启动UrlPreview实例。传递在请求页面URL时发送的额外标头

loadUrl(string $url): UrlPreview

加载并启动针对任何有效URL的抓取过程

getAll(): array

获取从页面抓取的所有数据

返回: 以以下格式的 Array 抓取数据

  • site - 关于网站的信息
    • url - 主网站URL
    • name - 网站名称,例如:'Instagram' 或 'Medium'
    • secure - Boolean true|false,根据http连接确定
    • responsive - Boolean true|false。如果网站有viewport元标签,则为true。基本的响应性检查
    • icon - 网站图标
    • language - ISO 639-1语言代码,例如:enes
  • page - 当前URL的页面信息
    • type - 页面类型,例如:websitearticleprofilevideo
    • url - 页面的规范URL
    • title - 页面标题
    • description - 页面描述
    • image - 如果存在,包含图像信息的数组
      • url - 图像URL
      • width - 图像宽度
      • height - 图像高度
    • video - 如果页面上有,包含视频信息的数组
      • url - 视频URL
      • width - 视频宽度
      • height - 视频高度
  • author - 关于内容作者的信息,例如
    • name - 博客上的作者姓名,社交网络网站上的个人姓名
    • handle - 社交媒体网站用户名
    • url - 更多文章的作者URL或在社交网络网站上的个人资料URL
  • app_links - 包含链接到页面的应用程序的数组,如
    • ios - iOS应用程序
      • url - 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'
      • app_store_id - 苹果AppStore应用程序ID
      • app_name - 应用程序名称
      • store_url - 可安装应用程序的链接
    • android - Android应用程序
      • url - 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'
      • package - Android PlayStore应用程序ID
      • app_name - 应用程序名称
      • store_url - 可安装应用程序的链接

get(string $section): array

获取一个爬取部分的 数据 sitepageprofileapp_links

返回: 包含爬取数据的数组。有关数据格式,请参阅 UrlPreview::getAll()

addListener(string $eventName, callable $listener, int $priority = 0): UrlPreview

UrlPreview上附加事件以进行数据处理或爬取过程。参数

  • $eventName - 要监听的事件。可用
    • page.scrape - 当爬取过程开始时触发
    • data.filter - 当通过getData()getAll()方法请求数据时触发
  • $listener - 一个可调用引用,它将获得包含可用数据的$event参数
  • $priority - 可调用应执行的顺序

扩展库

如果需要爬取更多URL的数据,可以将更多功能附加到PageMeta库。例如,从页面返回“条款和条件”链接

use Symfony\Component\EventDispatcher\Event;

$previewer = new \Layered\PageMeta\UrlPreview;
$previewer->addListener('page.scrape', function(Event $event) {
	$currentScrapedData = $event->getData();	// check data from other scrapers
	$crawler = $event->getCrawler();			// instance of DomCrawler Symfony Component
	$termsLink = '';

	$crawler->filter('a[href*=terms]')->each(function($node) use(&$termsLink) {
		$termsLink = $node->attr('href');
	});

	// forwards the scraped data
	$event->addData('site', [
		'termsLink'	=>	$termsLink
	]);
});
$previewer->loadUrl('http://github.com');

更多

请在此GitHub上报告任何问题。

欢迎任何贡献