-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
70 lines (57 loc) · 2.42 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const express = require('express')
const puppeteer = require('puppeteer');
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.get('/search/:searchTerm/:number', async(req,res) => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(`https://www.youtube.com/results?search_query=${req.params.searchTerm}`)
/*TODO:
Get Title
Get Link
Get Artist
Get Thumbnail
Get Length of Video
*/
async function autoScroll(page, scroll_number) {
await page.evaluate(async (scroll_number) => {
await new Promise((resolve) => {
let totalHeight = 0;
const timer = setInterval(() => {
const scrollHeight = window.innerHeight * scroll_number;
window.scrollBy(0, window.innerHeight);
totalHeight += window.innerHeight;
if (totalHeight > scrollHeight) {
clearInterval(timer);
resolve(true);
}
}, 100);
});
}, scroll_number);
}
await autoScroll(page, 12)
//ytd-thumbnail > #thumbnail > #overlays
try {
let scrapedData = await page.evaluate(() => {
return Array.from(document.querySelectorAll("div#dismissible.ytd-video-renderer"))
.map(element => {
return {
Thumbnail: element.querySelector("ytd-thumbnail > a > yt-image > img").getAttribute("src"),
Title: element.querySelector(".text-wrapper > #meta > #title-wrapper > h3 > a").getAttribute("title"),
Artist: element.querySelector(".text-wrapper > #channel-info > ytd-channel-name > #container > #text-container > yt-formatted-string > a").textContent,
Link: `https://youtube.com${element.querySelector("ytd-thumbnail > a").getAttribute("href")}`,
//Length: element.querySelector("ytd-thumbnail > #thumbnail > #overlays > ytd-thumbnail-overlay-time-status-renderer > span").textContent
}
})}
)
res.send(scrapedData.slice(0, req.params.number));
} catch (error) {
res.status(404);
}
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})