过去几周我一直在进行网络爬虫。 使用 PHP 库(PHP 简单 DOM),我正在运行一个 php 脚本(使用终端)以从中获取一些 URL 和 JSON 一些数据。到目前为止,这一直工作得很好。
最近想对某个站点进行扩展爬取,遇到如下问题:
与目前为止的任何其他网站不同,这个网站仅回应准系统标记服务器端,而是依赖单个 JS 脚本来构建相关标记加载。
很明显,我的 PHP 脚本无法处理(因为它没有执行 JS,因此据我所知,网站大部分都是空白的)因此我无法抓取网站,因为内容尚未创建。
我不确定如何进行。是否真的有可能将我当前的 PHP 脚本转换为与该站点“兼容”,或者我是否需要换档并合并浏览器,即选择一条完全不同的路线?
我目前认为我需要创建在 iFrame 中打开 URL 的 html/js 站点,这样我就可以通过控制台手动运行 JS 函数来提取数据。 不过,我希望有更可行的方法。
谢谢,
最佳答案
当我需要废弃一个网站时,我通常会:
1 - 在普通浏览器(ff、chrome 等)上浏览目标网站,同时监控/记录任何POST
/GET
请求包含相关信息,通过 Developer Tools
-> Network Tab
。
特别注意 XHR
请求,因为它们通常包含 json
编码数据。
这是我制作的一个小视频来说明这一点:
https://www.youtube.com/watch?v=JbiZBGt8cos
您可以模仿之前制作的请求 header
(在视频中有解释)并在curl
请求中使用它,即:
$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 ;
2 - 在某些情况下,如果没有 启用 JavaScript 的客户端 就无法抓取某些 URL,发生这种情况时,我通常使用 Selenium使用 Chrome
或 Firefox
。您也可以使用 PhantomJS , headless 浏览器。最新版本 GeckoDriver (由 Selenium 使用)也支持 headless 浏览。
我知道问题是关于 PHP
的,但是如果 OP 需要使用 Selenium
,Python
会更直观我' d说。在此基础上,这是 Python
中的 Selenium
示例:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.clear()
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
assert "No results found." not in driver.page_source
driver.close()
关于javascript - 用PHP爬取网站,但网站运行JS生成标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085261/