悠悠楠杉
PHP使用puppeteer抓取JS渲染后的页面内容
- 安装Node.js和npm:Puppeteer是运行在Node.js环境下的,所以首先需要安装Node.js。可以从Node.js官网下载并安装。
- 安装Puppeteer:在命令行中运行以下命令来全局安装Puppeteer。
bash npm install -g puppeteer
- 设置PHP环境:确保你的PHP环境已经安装并配置好,可以使用如XAMPP, MAMP, 或者直接在Linux/Windows环境中安装。
第二步:编写PHP脚本使用Puppeteer
由于Puppeteer是Node.js的库,我们不能直接在PHP脚本中调用它。一个常见的解决方案是通过命令行从PHP脚本调用Puppeteer脚本。你可以创建一个单独的JavaScript文件来处理网页抓取,然后从PHP调用这个JavaScript文件。
创建JavaScript文件(puppeteer.js)
```javascript
const puppeteer = require('puppeteer');
async function scrapeWebsite(url) {
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto(url, {waitUntil: 'networkidle0'});
const title = await page.title();
const content = await page.content();
const keywords = extractKeywords(content); // 假设有一个简单的关键词提取函数
const description = extractDescription(content); // 假设有一个简单的描述提取函数
const text = await extractText(content); // 提取正文内容,可能需要更复杂的逻辑来限制在1000字内
browser.close();
return { title, keywords, description, text };
}
function extractKeywords(content) { /* 实现关键词提取逻辑 / } function extractDescription(content) { / 实现描述提取逻辑 / } function extractText(content) { / 实现文本提取逻辑,确保限制在1000字左右 */ }
module.exports = scrapeWebsite;
```
这个JavaScript脚本负责打开一个无头浏览器,导航到给定的URL,等待页面加载完成,然后从页面中提取标题、关键词、描述和正文内容。
从PHP调用JavaScript文件
```php
<?php
$url = 'https://example.com'; // 要抓取的网页URL
$outputFile = 'output.md'; // 输出文件的名称和路径
$output = ''; // 用于收集输出内容
// 调用JavaScript脚本获取网页内容
exec("node puppeteer.js $url", $output);
$data = $output[0]; // 获取返回的数组第一个元素,即JavaScript脚本的输出结果(一个JSON字符串)
$data = json_decode($data, true); // 解析JSON字符串为数组
// 处理数据并生成Markdown格式的文章
$markdownContent = "## " . $data['title'] . "\n";
$markdownContent .= "### 关键词: " . implode(', ', $data['keywords']) . "\n";
$markdownContent .= "### 描述: " . $data['description'] . "\n";
$markdownContent .= "\n" . $data['text'] . "\n"; // 确保这里的文本符合Markdown格式要求,并限制在1000字左右(如果需要)
fileputcontents($outputFile, $markdownContent); // 保存为Markdown文件
echo "文章已生成并保存为: $outputFile";
?>
```
这段PHP代码通过puppeteer.js文件位于可执行路径中或提供正确的路径。同时,你需要根据实际情况调整extractKeywords
, extractDescription
, 和 extractText
函数的实现细节。