如何使用 Javascript 抓取 Javascript 呈现的网站?
How to scrape Javascript rendered websites using Javascript?
我正在尝试抓取此网站的 $('a[href^="mailto:"]')
:https://celsius.network/
当我进入浏览器控制台 运行 时,我得到一个 link 所以我知道它在那里。
问题是我的请求(使用 Axios 库)returns 加载了 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 之后完全加载的那个。
P.S。我是通过 firebase 函数来做的,所以我认为我可以安装的东西是有限的。
更新
const findEmail = url =>
new Promise((resolve, reject) => {
// here!
});
您的请求方法不足以模拟您在浏览器中访问页面时的预期。虽然有一些选择,但 puppeteer 可能是这份工作的候选人。
Most things that you can do manually in the browser can be done using 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();
})();
我不是很清楚你的限制...
there are limits to what I can install
如果你有 axios,我想你可以安装这个 npm 包吗?
根据您的更新,木偶师也可以通过承诺 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
});
我正在尝试抓取此网站的 $('a[href^="mailto:"]')
:https://celsius.network/
当我进入浏览器控制台 运行 时,我得到一个 link 所以我知道它在那里。
问题是我的请求(使用 Axios 库)returns 加载了 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 之后完全加载的那个。
P.S。我是通过 firebase 函数来做的,所以我认为我可以安装的东西是有限的。
更新
const findEmail = url =>
new Promise((resolve, reject) => {
// here!
});
您的请求方法不足以模拟您在浏览器中访问页面时的预期。虽然有一些选择,但 puppeteer 可能是这份工作的候选人。
Most things that you can do manually in the browser can be done using 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();
})();
我不是很清楚你的限制...
there are limits to what I can install
如果你有 axios,我想你可以安装这个 npm 包吗?
根据您的更新,木偶师也可以通过承诺 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
});