一起养成写作习惯!这是我参与「掘金日新计划 · 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寻找
爬虫的禁忌
不要违法!不要违法!不要违法!重要的事情说三遍,其次注意不要拉取过于频繁,如果造成对方服务器崩溃,对方也是会起诉的,切记