Skip to content

Instantly share code, notes, and snippets.

@egohub
Last active September 20, 2021 21:37
Show Gist options
  • Save egohub/4235a0e1423e700b4b234ada2ac570bb to your computer and use it in GitHub Desktop.
Save egohub/4235a0e1423e700b4b234ada2ac570bb to your computer and use it in GitHub Desktop.
medium scrape

scrape from medium

mkdir nodewebscraper

cd nodewebscraper

npm init --yes


npm install

npm run dev

const cheerio = require('cheerio');
const express = require('express');
const exphbs = require('express-handlebars');
const bodyParser = require('body-parser');
const request = require('request');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended : false}));
app.engine('handlebars', exphbs({ defaultLayout : 'main'}));
app.set('view engine','handlebars');
app.get('/', (req, res) => res.render('index', { layout: 'main' }));
app.get('/search',async (req,res) => {
const { tag } = req.query;
let datas = [];
request(`https://medium.com/search?q=${tag}`,(err,response,html) => {
if(response.statusCode === 200){
const $ = cheerio.load(html);
$('.js-block').each((i,el) => {
const title = $(el).find('h3').text();
const article = $(el).find('.postArticle-content').find('a').attr('href');
let data = {
title,
article
}
datas.push(data);
})
}
console.log(datas);
res.render('list',{ datas })
})
})
app.listen(3000,() => {
console.log("server is running on port 3000");
})
//nodewebscraper/views/index.handlebars
<form class="ui form" action="/search">
<input type="text" name="tag" placeholder="Search...">
<input type="submit" class="ui button" value="Search">
</form>
//nodewebscraper/views/list.handlebars
<div class="ui list">
{{#each datas}}
<a class="item" href="{{article}}">{{title}}</a>
{{/each}}
</div>
<a class="ui teal tag label" href="/">Back
//views/layouts/main.handlebars
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css">
<title>Scraper</title>
</head>
<body>
<div class="ui piled segment">
{{{body}}}
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment