javascript - 用PHP爬取网站,但网站运行JS生成标记

标签 javascript php web-crawler

过去几周我一直在进行网络爬虫。 使用 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使用 ChromeFirefox。您也可以使用 PhantomJS , headless 浏览器。最新版本 GeckoDriver (由 Selenium 使用)也支持 headless 浏览。


我知道问题是关于 PHP 的,但是如果 OP 需要使用 SeleniumPython 会更直观我' 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()

Example Src

关于javascript - 用PHP爬取网站,但网站运行JS生成标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50085261/

相关文章:

javascript - 在文件夹中添加电子表格文件

javascript - jQuery .ready() 错误?

javascript - 在提交/部署之前检测 Browserify 损坏的构建

php - MySQL Join 查询不带条件仍然包含不需要的结果

javascript - jquery验证消息变化(自定义消息集)

javascript - 检测构造函数(Symbol)——ES6

Javascript 保留单选按钮值、下拉值和复选框选择值

php - 仅抓取页面标题

python - 需要为将要解析 800 万个页面的高效网络爬虫提供设计建议 - Python

python-3.x - 从 beautifulsoup4 网络抓取结果中删除特定的 <h2 类>