分层 / url-preview
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- 包含图像信息的Array,如果存在url- 图像URLwidth- 图像宽度height- 图像高度
video- 包含视频信息的Array,如果在页面上找到url- 视频URLwidth- 视频宽度height- 视频高度
author- 内容作者信息,例如name- 博客上的作者姓名,社交网络网站上的个人姓名handle- 社交媒体网站用户名url- 更多文章的作者URL或社交网络网站的配置文件URL
app_links- 包含链接到页面的应用程序的Array,如ios- iOS应用程序url- 应用内操作的链接,例如:'nflx://www.netflix.com/title/80014749'app_store_id- Apple 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中的数据
返回: 包含部分抓取数据的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上报告任何问题。
