我找到了几种从另一个页面提取数据的方法,这些页面使用 AJAX 来加载内容。所以不可能使用 PHP 或专门 curl。
我的问题是我不太明白该怎么做。我留下代码:
<script src='//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", "https://ycapi.org/iframe/?v=6YzGOq42zLk", false);
xmlhttp.send();
var data = JSON.parse(xmlhttp.responseText);
document.getElementById("demo").innerHTML = 'enlace:' + data + '';
</script>
<div id='demo' />
示例 2:
<!DOCTYPE html>
<html>
<head>
<script src="http://yui.yahooapis.com/3.7.2/build/yui/yui-min.js"></script>
<meta charset=utf-8 />
<title>j</title>
</head>
<body>
<script>
YUI().use('yql', function(Y) {
Y.YQL('select * from data.html.cssselect where url="https://ycapi.org/iframe/?v=6YzGOq42zLk" and css="buttons", function(response) {
var html = response.query.results.results.div.download.content; document.getElementById('muestra').innerHTML = html;
});
});
</script>
<div id="muestra"></div>
</body>
</html>
我想知道为什么他们不工作。
正如Alvaro解释的那样,由于访问控制问题,这两种方法不起作用。
正如Delcio 所提到的,读取网页内容并提取其内容称为“抓取”。
注意: 虽然抓取本身通常不被认为是非法的,但大多数情况下它违反了网站/服务的使用条款。如果有 API 使用 api,如果有 RSS 使用 rss。
也就是说,仅使用 php“抓取”动态内容是相当复杂的,你必须假装自己是一个带有所有小工具的 Web 浏览器:VM javascript、HTML 解析器、HTML 渲染、会话、事件等。
因此,为了不重新发明轮子,我们将使用 QA 和测试工具:
Headless Chrome - 没有 GUI 的浏览器https://developers.google.com/web/updates/2017/04/headless-chrome
Puppeteer:控制无头 Chrome 的 Node 库https://github.com/GoogleChrome/puppeteer
Node:基于 V8 引擎的 javascript 执行环境https://nodejs.org/es/
Rialto:用于处理来自 PHP https://github.com/extractr-io/rialto/的 Node 资源的库/包
PuPHPeteer:PHP 的包装器/桥木偶实现https://github.com/extractr-io/puphpeteer
要求:PHP >=7.1,Node >= 8,Composer >= 0.2.2,64 位操作系统(在 Ubuntu 16.04.4 LTS x86_64 上测试)
您可以单独安装所有内容(对于依赖项和补丁之间的全新安装,计算 600mb),或者如果您已经拥有 Node 8、PHP 7.1 (CLI) 和 Composer:
测试.php
注意/警告/免责声明
该代码用于教育目的和概念证明。
您可以使用http://docs.guzzlephp.org/en/latest/
一个简单的例子是:
而且您还可以使用 file_get_contents ( http://php.net/manual/es/function.file-get-contents.php ),它或多或少是这样的:
更新:
我只是想到了另一种方法来捕获页面,就好像您实际上正在浏览一样。这将是关于在浏览器元素检查器控制台本身中用 javascript 实现一个机器人。因此,我进行了一些搜索,但并没有像通常发生的那样发明任何东西。
我给你一个非常基本的例子,假设你想在 google 上进行搜索,例如“bot scrap javascript”;打开google,在搜索引擎中粘贴文本并打开浏览器的元素检查器,进入控制台并输入$("#[SEARCH BUTTON ID]").click(); 这将执行搜索。也就是说,您可以从控制台访问 jQuery 和 javascript,因此请在其中制作您的脚本。
注意:显然这是一个手动过程,例如,它说 [SEARCH BUTTON ID] 你必须输入谷歌搜索按钮的 ID,它是动态的,所以你必须每次搜索它,或者访问它以另一种方式,例如使用 nth-child(x),但是当你拥有脚本时,你只需要打开浏览器(它可以是自动化的),访问网络(相同)并粘贴你的 bot 脚本甚至可以用信息发出 ajax 请求。
第一种方法尝试通过XMLHttpRequest (xhr) 对象加载网页内容来读取网页内容,该对象用于从 URL 获取信息,而无需重新加载整个页面。
它不起作用的问题是只能向执行代码的同一域发出请求(域、协议等必须匹配),但事实并非如此(至少不是来自这个站点)。因此,当您运行代码时,您将在 JavaScript 控制台中收到如下消息:
是的,如果在目标服务器上实施了HTTP 访问控制系统 (CORS)(但我不知道它是否属于你的),它会起作用,并且它们可以毫无问题地执行。
您介绍的第二种方法是基于YUI和YQL(Yahoo! Query Language),这是一种类似于 SQL 的语言,允许您通过不同的服务进行查询和获取数据。
该代码有几个错误,使其无法正常工作。例如:查询没有很好地封装在单引号中(它有一个开始但没有结束引号),因此您将收到“无效或意外令牌”错误。这很容易解决。
然后查询似乎试图读取按钮的 CSS(我不是 YQL 专家,我可能读错了,所以不要太在意我)而不是 URL 的 HTML 代码你作为参数传递。要读取 HTML,查询将类似于:
所以代码看起来像这两个更正:
这样,请求可以工作,但结果什么也不返回,只是一条错误消息:不再支持 html 表,因此不返回所请求 URL 的 HTML 代码。在这个片段中你看不到的东西(因为它显示了一个 https/http 错误,但你可以在这个JSFiddle中看到它)。
在这里,我向您展示了如何使用 PHP 中的php-simple-html-dom-parser库从网站中提取数据(网络抓取)的示例:
例子:
结果: