如何制作一个简单的爬虫(Nodejs)

155 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

爬虫

爬虫其实就是自动化的信息采集器,就好比以前我们手工抄书一样,现在只不过是用一段代码完成抄书的工作,在效率提高的同时,也能将数据有序化存储,为以后的数据清洗以及数据分析打下基础。

按爬取的类型来说,大概可以分为页面爬虫和数据爬虫

页面爬虫

大部分静态页面中,数据主要存在于dom中,这时候就需要读取这个页面,找到对应的dom,把数据保存起来。 这里我们常用crawler.js+cherrio

例如笔者之前爬取,你可把这理解为get请求某个页面,然后通过选择器选中相应的dom元素

const useragentFromSeed = require('useragent-from-seed')
const Crawler = require('crawler')
const profileSpider = new Crawler({
    rateLimit: 2 * 1000,
    userAgent: useragentFromSeed(),
    proxy: 'http://127.0.0.1:7890',
    callback: function (error, res, done) {
        if (error || res.statusCod === 404) {
            console.log(error || res.statusCod)
        } else {
            console.log('spider on working:' + res.req.path)
            const $ = res.$
            let movies = []
            let obj = {}

            $('#content .facts').eq(0).find('tr').each((i, e) => {
                let key = $(e).children('td').eq(0).text()
                let value = ''
                switch (key) {
                    case 'Birth Name':
                        key = 'birthName'
                        value = $(e).children('td').eq(1).text()
                        break
                    case 'Occupation':
                        key = 'occupation'
                        value = $(e).children('td').eq(1).text()
                        break
                    case 'Birthday':
                        key = 'birthday'
                        let birthMonth = $(e).find('a').eq(0).attr('href').split('/')
                        birthMonth = birthMonth[birthMonth.length - 2]
                        const birthYear = $(e).find('a').eq(1).text()
                        value = birthYear + '-' + birthMonth
                        break
                    case 'Sign':
                        key = 'sign'
                        value = $(e).find('a').text()
                        break
                    case 'Birthplace':
                        key = 'birthplace'
                        value = $(e).children('td').eq(1).text()
                        break
                    default:
                        break
                }
                if (value !== '') {
                    obj[key] = value
                }
            })
            $('#content .facts').eq(1).find('td').each((i, e) => {
                movies.push($(e).text())
            })
            movies.splice(-3)
            const starProfile = {
                name: $('#content h1').text(),
                starPhoto: 'https://www.xxx.com' + $('.starphoto').attr('src'),
                occupation: obj.occupation ? obj.occupation : '', // 职业
                birthday: obj.birthday ? obj.birthday : '',
                sign: obj.sign ? obj.sign : '', // 星座
                birthPlace: obj.birthplace ? obj.birthplace : '',
                description: $('#profile').text(),
                movies: movies,
                url: res.options.parameter1
            }
        done()
    }
})

数据爬虫

数据爬虫主要指的是某些网站有一些公开或者半公开的API,可以直接拉取数据。 比如像这种测试用的API,jsonplaceholder.typicode.com/posts 还有像instagram这种半公开的API,我也曾经写过一篇文章分析过他接口的加密规则。后来,人家直接不加密了,直接需要登录.

const rp = require('request-promise')
rp({
    uri:`https://www.instagram.com/${username}/?__a=1`,
    method:'GET',
    headers:{  
       user-agent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
        cookie:`csrftoken=${csrftoken};
            sessionid=${sessionid};`
    }
})
//sessionid,csrftoke需要你登陆后从浏览器中cookie寻找

爬虫的禁忌

不要违法!不要违法!不要违法!重要的事情说三遍,其次注意不要拉取过于频繁,如果造成对方服务器崩溃,对方也是会起诉的,切记