分层 / 页面元数据
获取互联网上任何URL的详细信息!用于HTML、OpenGraph、Schema数据的抓取器
Requires
- fabpot/goutte: ~4.0
- symfony/event-dispatcher: ~5.1
Requires (Dev)
- phpunit/phpunit: ^9.3
README
页面元数据 是一个PHP库,可以从互联网上的任何URL获取详细信息!它使用HTML元标签和OpenGraph数据,并在需要时回退到详细的HTML抓取。
亮点
- 适用于互联网上的任何有效URL!
- 遵循页面重定向
- 使用所有可用的抓取方法:HTML标签、OpenGraph、Schema数据
潜在用途
- 在文章中显示链接的信息卡
- 消息应用中的链接丰富预览
- 从用户提交的URL中提取信息
如何使用
安装
将 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
- 主网站URLname
- 网站名称,例如:'Instagram' 或 'Medium'secure
- Boolean true|false,根据http连接确定responsive
- Boolean true|false。如果网站有viewport
元标签,则为true。基本的响应性检查icon
- 网站图标language
- ISO 639-1语言代码,例如:en
、es
page
- 当前URL的页面信息type
- 页面类型,例如:website
、article
、profile
、video
等url
- 页面的规范URLtitle
- 页面标题description
- 页面描述image
- 如果存在,包含图像信息的数组url
- 图像URLwidth
- 图像宽度height
- 图像高度
video
- 如果页面上有,包含视频信息的数组url
- 视频URLwidth
- 视频宽度height
- 视频高度
author
- 关于内容作者的信息,例如name
- 博客上的作者姓名,社交网络网站上的个人姓名handle
- 社交媒体网站用户名url
- 更多文章的作者URL或在社交网络网站上的个人资料URL
app_links
- 包含链接到页面的应用程序的数组,如ios
- iOS应用程序url
- 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'app_store_id
- 苹果AppStore应用程序IDapp_name
- 应用程序名称store_url
- 可安装应用程序的链接
android
- Android应用程序url
- 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'package
- Android PlayStore应用程序IDapp_name
- 应用程序名称store_url
- 可安装应用程序的链接
get(string $section): array
获取一个爬取部分的 数据 site
、page
、profile
或 app_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上报告任何问题。