Install Dependencies
Shell
x
1
1
npm init -y
Shell
1
1
1
npm i express
Shell
1
1
1
npm i puppeteer
Shell
1
1
1
npm i ejs
Shell
1
1
1
npm i google-search-results-nodejs
Shell
1
1
1
npm i puppeteer-extra
Shell
1
1
1
npm i puppeteer-extra-plugin-stealth
Scrape YouTube Keyword Suggestions Using Node.js Express Puppeteer
index.js
JavaScript
1
66
66
1
const puppeteer = require("puppeteer-extra");
2
const StealthPlugin = require("puppeteer-extra-plugin-stealth");
3
const ObjectsToCsv = require('objects-to-csv');
4
const express = require('express')
5
puppeteer.use(StealthPlugin());
6
const app = express()
7
app.use(express.urlencoded({ extended: false }))
8
app.set('view engine','ejs')
9
app.get('/', (req, res) => {
10
res.render('index',{suggestions:[]})
11
})
12
13
app.post('/getsuggestions', (req, res) => {
14
let search = req.body.search.split('\n')
15
getYoutubeAutocomplete(search)
16
.then((data) => {
17
console.log(data)
18
res.render('index',{suggestions:data.autocompleteResults})
19
})
20
})
21
async function getYoutubeAutocomplete(search) {
22
const queries = search;
23
const URL = "https://www.youtube.com";
24
const browser = await puppeteer.launch({
25
headless: false,
26
args: ["--no-sandbox", "--disable-setuid-sandbox"],
27
});
28
29
const page = await browser.newPage();
30
31
await page.setDefaultNavigationTimeout(60000);
32
await page.waitForTimeout(4000)
33
34
await page.goto(URL);
35
await page.waitForSelector("#contents");
36
37
const autocompleteResults = [];
38
for (query of queries) {
39
await page.click("#search-input");
40
await page.keyboard.type(query);
41
await page.waitForTimeout(5000);
42
const results = {
43
query,
44
autocompleteResults: await page.evaluate(() => {
45
return Array.from(document.querySelectorAll(".sbdd_a li"))
46
.map((el) => el.querySelector(".sbqs_c")?.textContent.trim())
47
.filter((el) => el);
48
}),
49
};
50
autocompleteResults.push(results);
51
await page.click("#search-clear-button");
52
await page.waitForTimeout(2000);
53
}
54
55
await browser.close();
56
57
const csv = new ObjectsToCsv(autocompleteResults);
58
await csv.toDisk('./test.csv');
59
60
61
return autocompleteResults;
62
}
63
64
app.listen(5000,() => {
65
console.log("App is listening on port 5000")
66
})
views/index.ejs
JavaScript
1
38
38
1
<!DOCTYPE html>
2
<html lang="en">
3
4
<head>
5
<meta charset="UTF-8">
6
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7
<meta name="viewport" content="width=device-width, initial-scale=1.0">
8
<title>Get Youtube Suggestions</title>
9
</head>
10
11
<body>
12
<form action="/getsuggestions" method="post">
13
<textarea cols="15" rows="15" name="search" required></textarea>
14
<button>Get Suggestions</button>
15
</form>
16
<%if(suggestions){%>
17
18
<table>
19
<thead>
20
<tr>
21
<th>Suggestions</th>
22
</tr>
23
</thead>
24
<tbody>
25
<%suggestions.forEach(item=> {%>
26
<tr>
27
<td>
28
<%=item%>
29
</td>
30
</tr>
31
<%})%>
32
</tbody>
33
</table>
34
35
<%}%>
36
</body>
37
38
</html>