Javascript PHP使用Puppeter调用JS
我有两个文件Javascript PHP使用Puppeter调用JS,javascript,php,puppeteer,Javascript,Php,Puppeteer,我有两个文件pop.php和pop.js <?php $io = [ 0 => ['pipe', 'r'], // node's stdin 1 => ['pipe', 'w'], // node's stdout 2 => ['pipe', 'w'], // node's stderr ]; $proc = proc_open('node pop.js', $io, $pipes);
pop.php
和pop.js
<?php
$io = [
0 => ['pipe', 'r'], // node's stdin
1 => ['pipe', 'w'], // node's stdout
2 => ['pipe', 'w'], // node's stderr
];
$proc = proc_open('node pop.js', $io, $pipes);
$nodeStdout = $pipes[1]; // our end of node's stdout
echo date('H:i:s '), fgets($nodeStdout);
proc_close($proc);
echo date('H:i:s '), "done\n";
?>
我从JS文件中得到的响应是一个空数组,所以我不认为正在运行Puppeter。当我在没有PHP的情况下调用js文件时,我从Puppeter获得了实际结果。有没有办法从PHP中实现这一点?如果节点提供pop.js,它是否有URL?您是否可以向它发出HTTP请求,而不是使用进程/管道等?它可能会更容易使用。我现在正在本地测试一切,我还没有将它上传到我的服务器。如果我将一个基本的{“foo”:“bar}发布到JSON.stringify中,它会工作。。。但是它没有从JS代码中获得数组。你可以在本地运行web服务器,这不是一个应该阻止你的问题老实说,我不确定我要找什么,但是在本地运行php web服务器,这将是您需要为其运行服务器的节点应用程序——我建议PHP代码向节点应用程序发出HTTP请求。如果您进行了配置,则可以从同一个Web服务器为这两个站点提供服务。
const puppeteer = require('puppeteer');
var cardsArray = [];
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://www.psacard.com/Pop/GetItemTable?headingI2510&categoryID=20019&isPSADNA=false&pf=0&_=1583525404214");
const tr = await page.evaluate(() => {
const rowNodeList = document.querySelectorAll('table tr');
const rowArray = Array.from(rowNodeList);
return rowArray.slice(1).map(tr => {
const dataNodeList = tr.querySelectorAll('td');
const dataArray = Array.from(dataNodeList);
const [ cardNumber, cardType, c, d, psa1, psa1h, psa2, psa3, psa4, psa5, psa6, psa7, psa8, psa9, psa10, popTotal ] = dataArray.map(td => td.textContent.replace(/\s+/g, ' ').replace(/\s+Shop/g, ' ').substring(1));
return {
cardNumber,
cardType,
psa1: psa1.split(" ")[0],
psa1h: psa1h.split(" ")[0],
psa2: psa2.split(" ")[0],
psa3: psa3.split(" ")[0],
psa4: psa4.split(" ")[0],
psa5: psa5.split(" ")[0],
psa6: psa6.split(" ")[0],
psa7: psa7.split(" ")[0],
psa8: psa8.split(" ")[0],
psa9: psa9.split(" ")[0],
psa10: psa10.split(" ")[0],
popTotal: popTotal.split(" ")[0]
};
});
});
const getName = tr.map(card => {
if (card.cardNumber === '248 ') {
console.log(card);
cardsArray.push(card);
}
})
process.stdout.write(JSON.stringify(cardsArray)+"\n");
await browser.close();
})();