从零开始写爬虫

爬虫的起源

爬虫的本质就是向目标服务器发送请求,获取起请求内容,然后解析提取关键内容,可分为以下步骤:
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去。然后找到所有的结果地址。

举个例子

百度图片去找美女,然后匹配所有的图片,然后保存到本地。以此类推,知乎找个钓鱼贴,爬里面所有的图片地址。感兴趣的图片就全保存下来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值