爬虫的起源
爬虫的本质就是向目标服务器发送请求,获取起请求内容,然后解析提取关键内容,可分为以下步骤:
1. 向目标服务器发送请求
2. 获取服务器返回值
3. 解析返回内容,提取关键内容
代码解析
#app.js
const http = require('http')
const options = {
host: 'www.baidu.com', // 目标服务器域名
port: 80, // 目标服务器请求端口
method: 'GET', // 请求方法
path: '/'
}
// 发起请求
const req = http.request(options, res => {
let content = ''
res.on('data', chunk => {
content += chunk
})
res.on('end', () => {
console.log(content)
})
})
// 监听异常
req.on('error', err => {
console.log(err)
})
req.end()
// 保存文件然后运行 node app.js
控制台就会打印出www.baidu.com的页面内容对应的html内容
当我们获取到内容之后就是对内容解析然后拿到我们的像要的值,比如在这里我们向要获取 更多 按钮的跳转地址是多少。
在开始解析内容之前我们可以使用现有的包来对页面数据进行解析:
// 安装cheerio
npm install cheerio -D // -D是--save-dev的简写
// 修改app.js
#app.js
const http = require('http')
// 引入cheerio包
const cheer = require('cheerio')
const options = {
host: 'www.baidu.com', // 目标服务器域名
port: 80, // 目标服务器请求端口
method: 'GET', // 请求方法
path: '/'
}
// 发起请求
const req = http.request(options, res => {
let content = ''
res.on('data', chunk => {
content += chunk
})
res.on('end', () => {
// 调用parseHTML函数来处理content
parseHTML(content)
})
})
// 监听异常
req.on('error', err => {
console.log(err)
})
req.end()
// parseHTML
function parseHTML(content) {
const $ = cheer.load(content)
console.log($('#bri').attr('href'))
}
最后运行 node app.js
从起源到进化
上面的起源还不能称之为爬虫,如果非要有称呼的话,可能就是“爬”。爬和爬虫的区别就是单细胞动物和人的区别。
下面先讲讲如何让爬这个动词变为有点生命的渣爬虫,嗯,很渣的能爬的虫。
从上面的例子你看出来,他能实现的就只是从一张页面找到一个地址,这时候我就站起来了,人工一个f12审查一下元素就能找到的东西,为什么要写这么久的代码来做到?就和大学学了四年用各种语言写100以内的加减法一样?
基于上面的内容我们继续做。爬虫的本质在于虫这个生命力。怎么做?
// 我们把刚刚的目标源换一下,试着在百度一个词条,然后拷贝跳转的url
#app.js
const http = require('http')
// 引入cheerio包
const cheer = require('cheerio')
// 引入url来解析url
const { URL } = require('url')
const options = new URL('https://www.baidu.com/s?wd=%E5%90%83%E9%A5%AD&pn=0&oq=%E5%90%83%E9%A5%AD&ie=utf-8&usm=4&rsv_idx=1&rsv_pq=829be9770000fddf&rsv_t=a2d7IOEUjATlbQyVmTohybDLd4ulaim6KdZ7q1022OHWdB9ZyHun6Qa92II')
// 发起请求
const req = http.request(options, res => {
let content = ''
res.on('data', chunk => {
content += chunk
})
res.on('end', () => {
// 调用parseHTML函数来处理content
parseHTML(content)
})
})
// 监听异常
req.on('error', err => {
console.log(err)
})
req.end()
// parseHTML
function parseHTML(content) {
const $ = cheer.load(content)
// 找到每个对应的搜索结果的跳转地址
console.log($('.c-container.result h3 a').attr('href'))
}
运行 node app.js
拿到这些地址你可以干什么就是你的事情啦,你可以去每个页面里面捞图片处理啊,也可以去捞关键字出来等等。这里就暂时不详细介绍了。后面在继续说一点关于页面分页的事情。
上面说的还是依然是爬的问题,现在我们要让爬继续长出脚。
注意刚刚的百度的词条下面的分页器,来回点两下看看url的变换
这是第一页的url:
这是第二页的url:
好了,我们可以开始搞事情了,比如写个循环,以此从0爬到1000去。然后找到所有的结果地址。
举个例子
百度图片去找美女,然后匹配所有的图片,然后保存到本地。以此类推,知乎找个钓鱼贴,爬里面所有的图片地址。感兴趣的图片就全保存下来了。