【发布时间】:2019-12-22 20:09:41
【问题描述】:
我正在创建一个 Twitter 抓取工具作为一个项目。向下滚动时,推文会在 DOM 中呈现,因此我想使用 Puppeteer 滚动、提取数据并将其保存到预定义的对象中,然后继续滚动。问题是脚本实际上并没有修改提供的对象,我只剩下一个空对象。
提取数据的 for 循环在滚动函数外部调用时起作用(即,我可以提取页面中呈现的第一条推文)。滚动功能本身有效,我是从Puppeteer - scroll down until you can't anymore 获得的。
出于测试目的,我将滚动功能设置为仅滚动 20 次(否则它被设计为滚动直到无法再滚动)。这是我的代码:
app.get('/scrape', async (req, res) => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setJavaScriptEnabled(true)
await page.goto(`https://twitter.com/${req.query.url}`);
await page.setJavaScriptEnabled(true)
let obj = {}
await autoScroll(page, obj)
async function autoScroll(page, obj) {
await page.evaluate(async (obj) => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 400;
var count = 0
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
for (let i = 0; i < 100; i++) {
let id, date, text
try {
id = document.body.childNodes[7].childNodes[3].childNodes[1].childNodes[5].childNodes[1].childNodes[1].childNodes[3].childNodes[1].childNodes[3].childNodes[7].childNodes[1].childNodes[3].childNodes[1].childNodes[i].childNodes[1].getAttribute('data-tweet-id')
date = document.body.childNodes[7].childNodes[3].childNodes[1].childNodes[5].childNodes[1].childNodes[1].childNodes[3].childNodes[1].childNodes[3].childNodes[7].childNodes[1].childNodes[3].childNodes[1].childNodes[i].childNodes[1].childNodes[3].childNodes[1].childNodes[3].childNodes[1].getAttribute('title')
text = document.body.childNodes[7].childNodes[3].childNodes[1].childNodes[5].childNodes[1].childNodes[1].childNodes[3].childNodes[1].childNodes[3].childNodes[7].childNodes[1].childNodes[3].childNodes[1].childNodes[i].childNodes[1].childNodes[3].childNodes[3].childNodes[1].innerHTML
obj[id] = { date: date, text: text }
console.log(i)
} catch (err) { continue }
}
count++
//if(totalHeight >= scrollHeight){
if (count === 20) {
clearInterval(timer);
resolve();
}
}, 400);
});
}, obj);
}
res.send(obj)
await browser.close();
})
请求每次发送一个空对象。我没有收到任何错误消息或控制台日志;如果它们在那里,我看不到它们,因为它们是在 Puppeteer 生成的无头 Chrome 浏览器的上下文中执行的。
任何帮助将不胜感激!
【问题讨论】:
-
你的节点代码使用像 babel 这样的转译器吗?
-
不适用于这个文件,不。我的前端是 React JSX,所以我用 babel 编译它。
标签: javascript puppeteer