过去几周我一直在做网络浏览。 使用PHP库(PHP Simple DOM),运行php脚本(使用终端)来获取一些URL和JSON中的一些数据。到目前为止,这一直非常好。
最近我想扩展特定网站的抓取工作并遇到以下问题:
与目前为止的任何其他站点不同,这个站点只回应一个准系统标记服务器端,而是依靠单个JS脚本来构建相关的标记onload。
显然我的PHP脚本无法处理(因为它没有执行JS,因此该网站大部分都是我所知道的空白)因此我无法抓取该网站,因为内容尚未创建。
我不确定如何继续。它实际上是否可能将我当前的PHP脚本转换为与该站点“兼容”,或者我是否需要更换齿轮并合并浏览器,即选择完全不同的路径?
我目前认为我需要创建html / js网站,在iFrame中打开URL,这样我就可以通过控制台手动运行JS功能来提取数据。 但是,我希望有一种更可行的方式。
感谢,
答案 0 :(得分:2)
我看到两条可能的路径:
如果构建DOM的JavaScript通过一个或多个AJAX调用获取数据,您也可以直接从这些URL中删除(无论如何这往往更容易,例如,如果它与JSON对话) API)。
模拟浏览器,例如使用Selenium。例如,this文章讨论了您提到的确切挑战,并提供了使用Selenium和Python的解决方案。
答案 1 :(得分:2)
当我需要废弃网站时,我通常会这样做:
1 - 在普通浏览器(ff,chrome等)上浏览目标网站,同时监控/记录任何POST
/ {{1通过GET
- >包含相关信息的请求Developer Tools
。
请特别注意Network Tab
个请求,因为它们通常包含XHR
个编码数据
这是一个小视频,我已经举例说明了这一点:
https://www.youtube.com/watch?v=JbiZBGt8cos
您可以模仿之前制作的json
(在视频中说明)并在request headers
请求中使用它,即:
curl
2 - 在某些情况下,如果没有启用JavaScript的客户端,则无法抓取某些网址,当发生这种情况时,我通常会使用Selenium和{ {1}}或$headers = [
"Connection: keep-alive",
"Accept: application/json, text/javascript, */*; q=0.01",
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"DNT: 1",
"Accept-Language: pt,en-US;q=0.9,en;q=0.8,pt-PT;q=0.7,pt-BR;q=0.6",
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://s1te.com/json_rand.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$server_output = curl_exec ($ch);
curl_close ($ch);
print $server_output ;
。您还可以使用无头浏览器PhantomJS。最新版本的GeckoDriver(由Selenium使用)也支持无头浏览。
我知道问题是关于Chrome
,但如果OP需要使用Firefox
,PHP
更直观我会说。基于此,这里是Selenium
中的Python
示例:
Selenium