分层/url-preview

此包已被废弃,不再维护。作者建议使用分层/page-meta包。

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

2.0.1 2020-11-29 16:08 UTC

This package is auto-updated.

Last update: 2020-11-29 16:12:16 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 - 包含图像信息的Array,如果存在
      • url - 图像URL
      • width - 图像宽度
      • height - 图像高度
    • video - 包含视频信息的Array,如果在页面上找到
      • url - 视频URL
      • width - 视频宽度
      • height - 视频高度
  • author - 内容作者信息,例如
    • name - 博客上的作者姓名,社交网络网站上的个人姓名
    • handle - 社交媒体网站用户名
    • url - 更多文章的作者URL或社交网络网站的配置文件URL
  • app_links - 包含链接到页面的应用程序的Array,如
    • ios - iOS应用程序
      • url - 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'
      • app_store_id - Apple 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中的数据

返回: 包含部分抓取数据的Array。有关数据格式,请参阅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上报告任何问题。

欢迎任何贡献