从基于JavaScript或Ajax的网页中提取文本与传统静态HTML页面不同,因为这些页面的内容通常是动态加载的。当浏览器请求页面时,初始HTML可能只包含一个框架,而实际内容是通过后续的JavaScript执行和Ajax请求加载的。
最可靠的方法是模拟真实浏览器的行为,等待JavaScript执行完成后再提取内容。
const puppeteer = require('puppeteer');
async function extractText(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' }); // 等待网络活动停止
// 提取页面所有文本
const text = await page.evaluate(() => {
return document.body.innerText;
});
await browser.close();
return text;
}
// 使用示例
extractText('https://example.com').then(text => {
console.log(text);
});
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
options = Options()
options.headless = True
driver = webdriver.Chrome(options=options)
try:
driver.get("https://example.com")
time.sleep(3) # 等待页面加载
text = driver.find_element(By.TAG_NAME, 'body').text
print(text)
finally:
driver.quit()
对于Ajax加载的内容,可以分析页面发出的网络请求,直接获取数据源。
const axios = require('axios');
const cheerio = require('cheerio');
async function getDynamicContent(url) {
try {
const response = await axios.get(url);
const $ = cheerio.load(response.data);
// 提取文本
const text = $('body').text();
return text;
} catch (error) {
console.error('Error:', error);
}
}
注意:这种方法只能获取初始HTML,无法获取JavaScript动态加载的内容。
| 方法 | 优势 | 劣势 | |------|------|------| | 浏览器自动化(Puppeteer/Selenium) | 能获取完整渲染后的内容,最接近真实用户看到的效果 | 资源消耗大,速度慢 | | 分析网络请求 | 直接获取数据源,效率高 | 需要手动分析请求,可能遇到反爬机制 | | 传统HTML解析 | 简单快速 | 无法获取动态加载内容 |
原因:代码执行太快,页面还未完成渲染或Ajax请求未完成。
解决方案:
waitUntil
选项 (Puppeteer)// Puppeteer 等待特定元素
await page.waitForSelector('#content-loaded');
原因:网站检测到自动化工具或频繁请求。
解决方案:
// 设置headers示例
await page.setExtraHTTPHeaders({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
});
解决方案:
// Puppeteer 模拟滚动
await page.evaluate(async () => {
await new Promise((resolve) => {
let totalHeight = 0;
const distance = 100;
const timer = setInterval(() => {
const scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if(totalHeight >= scrollHeight){
clearInterval(timer);
resolve();
}
}, 100);
});
});
const text = await page.evaluate(() => {
const shadowRoot = document.querySelector('#host-element').shadowRoot;
return shadowRoot.textContent;
});
const frame = page.frames().find(frame => frame.name() === 'iframe-name');
const iframeText = await frame.$eval('body', el => el.textContent);
const altTexts = await page.$$eval('img[data-src]', imgs =>
imgs.map(img => img.alt || '')
);
通过以上方法和技巧,您可以有效地从基于JavaScript或Ajax的网页中提取所需文本内容。
没有搜到相关的文章