[英]How to scrape Javascript rendered websites using Javascript?
我正在尝试刮擦此网站的$('a[href^="mailto:"]')
: https : //celsius.network/
当我进入浏览器控制台并运行它时,我得到一个链接,所以我知道它在那里。
问题是我的请求(使用Axios库)在加载javascript之前返回了DOM。 我已经设置了User-Agent,但看起来好像没有用。
const axiosClient = () =>
axios.create({
headers: {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"
},
timeout: 10000
});
axiosClient()
.get("https://celsius.network")
.then(({ data }) => {
console.log("DATAAAAAAAA: ", data);
})
这将返回带有主体的原始HTML:
<body>
<div id="app"> </div>
....
而不是在所有javascript处理完DOM之后完全加载的代码。
PS我是通过firebase函数来执行此操作的,所以我认为我可以安装的内容受到限制。
更新
const findEmail = url =>
new Promise((resolve, reject) => {
// here!
});
您的请求方法不足以模仿您在浏览器中访问页面时的期望。 尽管有很多选择,但是伪娘可能是这份工作的候选人。
您可以在浏览器中手动执行的大多数操作都可以使用Puppeteer完成!
查看以下内容...
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://celsius.network/');
const textContent = await page.evaluate(() => document.querySelector('a[href^="mailto:"]').textContent);
console.log(textContent); // presale@celsius.network
browser.close();
})();
我不清楚您的限制...
我可以安装的东西有限制
如果您有axios,我假设您可以安装此npm软件包?
根据您的更新,也可以通过promise API来制作人偶。 以下应该为您做...
const findEmail = url =>
new Promise((resolve, reject) => {
puppeteer.launch().then((browser) => {
browser.newPage().then((page) => {
page.goto('https://celsius.network/').then(() => {
page.evaluate(() => document.querySelector('a[href^="mailto:"]').textContent).then((element) => {
resolve(element);
browser.close();
});
});
});
});
});
findEmail().then((email) => {
console.log(email); // presale@celsius.network
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.