Node学习笔记(十二)—— 获取网页数据

简单获取axios + cheerio
  1. 安装npm install axiosnpm install cheerio,参考cheerio

  2. 导入模块

    let axios=require('axios')
    const cheerio=require('cheerio')
    
  3. 请求数据

    axios.get(httpUrl).then(res=>{
        // console.log(res.data)
        // 用cheerio解析html文档
       let $= cheerio.load(res.data)
       // console.log($)
       // 获取当前页面所有表情链接
       $('#home .col-sm-9>a').each((index,element)=>{
        // console.log(element)
        // 获取每一个a标签中的href属性值
        let href=$(element).attr('href')
        console.log(href)
       })
    })
    
  4. 反爬虫

    // 使用第三方代理
    let axios=require('axios')
    let httpUrl="https://www.doutula.com/"
    let options={
        proxy:{
            host:'221.229.252.98', // 代理ip
            port:9797 // 代理端口号
        }
    }
    axios.get(httpUrl,options).then(res=>{
        console.log(res)
    })
    
使用puppeteer插件
  1. 安装npm i puppeteer,参考puppeteer或者puppeteer CN

  2. 引入,打开浏览器窗口

    let puppeteer=require('puppeteer')
    async function test() {
        // puppeteer.launch 实例开启浏览器,
        // 可以传入一个options对象,
        // 可以配置为无界面浏览器和有界面浏览器,无界面浏览器性能更高,有界面一般用于调试
            let options={
                // 设置视窗的框高
                defaultViewport:{
                    width:800,
                    height:800
                },
                // 设置为有界面,如果为true,则为无界面
                headless:false
    
            }
            const browser = await puppeteer.launch(options)
            // 打开页面
            let page = await browser.newPage()
            // 访问网站
            await page.goto('https://www.baidu.com')  
    }
    test()
    
  3. 截屏

    async function test() {
    	    // puppeteer.launch 实例开启浏览器,
    	    // 可以传入一个options对象,
    	    // 可以配置为无界面浏览器和有界面浏览器,无界面浏览器性能更高,有界面一般用于调试
    	        let options={
    	            // 设置视窗的框高
    	            defaultViewport:{
    	                width:800,
    	                height:800
    	            },
    	            // 设置为有界面,如果为true,则为无界面
    	            headless:false
    	
    	        }
    	        const browser = await puppeteer.launch(options)
    	        // 打开页面
    	        let page = await browser.newPage()
    	        // 访问网站
    	        await page.goto('https://www.baidu.com')
    	        // 截屏
    	        await page.screenshot({path: 'example.png'})
    	}
    	test()
    
  4. 获取页面元素

    async function test() {
    	    // puppeteer.launch 实例开启浏览器,
    	    // 可以传入一个options对象,
    	    // 可以配置为无界面浏览器和有界面浏览器,无界面浏览器性能更高,有界面一般用于调试
    	        let options={
    	            // 设置视窗的框高
    	            defaultViewport:{
    	                width:800,
    	                height:800
    	            },
    	            // 设置为有界面,如果为true,则为无界面
    	            headless:false
    	
    	        }
    	        const browser = await puppeteer.launch(options)
    	        // 打开页面
    	        let page = await browser.newPage()
    	        // 访问网站
    	        await page.goto('https://www.baidu.com')
    	        // 获取页面内容id为u1下的a标签
    	        // $$eval函数使得回调函数可以运行在浏览器中
    	        let elements=await page.$$eval('#u1 a',(elements)=>{
    	            console.log(elements) // 在浏览器控制台输出
    	            let eles=[]
    	            elements.forEach((item,i)=>{     
    	                console.log(item.innerHTML) // 在浏览器控制台输出
    	                let eleObj={
                            href:item.getAttribute('href'),
                            text:item.innerText
    	                }
    	                eles.push(eleObj)
    	            })
    	        })
    	        // 监听事件,监听浏览器输出内容
    	        page.on('console',(...args)=>{
    	            console.log(args) // 在命令提示符终端输出
    	        })
    	}
    	test()
    
  5. 操作页面内容

    async function test() {
    	    // puppeteer.launch 实例开启浏览器,
    	    // 可以传入一个options对象,
    	    // 可以配置为无界面浏览器和有界面浏览器,无界面浏览器性能更高,有界面一般用于调试
    	        let options={
    	            // 设置视窗的框高
    	            defaultViewport:{
    	                width:800,
    	                height:800
    	            },
    	            // 设置为有界面,如果为true,则为无界面
    	            headless:false
    	
    	        }
    	        const browser = await puppeteer.launch(options)
    	        // 打开页面
    	        let page = await browser.newPage()
    	        // 访问网站
    	        await page.goto('https://www.baidu.com')
    	        // 获取输入框
    	        let elementInput= await page.$('#kw')
    	        // console.log(elementInput[0])
    	        // 聚焦输入框
    	        await elementInput.focus()
    	        // 向输入框输入内容内容
    	        await page.keyboard.type('北京')
    	        // 获取搜索按钮
    	        let elementButton=await page.$('#form input[type="submit"]')
    	        // 点击搜索按钮
    	        await elementButton.click()
    	}
    	test()
    
爬虫
  1. 通过模拟浏览器的请求,服务器返回我们需求数据,将数据解析出来,并且保存。这样的行为称爬虫
  2. 爬虫流程
    • 确定想要的数据
    • 分析页面
      获取数据的方式(正则,cheerio)
    • 编写单个数据获取的案例
    • 遇到阻碍,进行反爬对抗
      将请求头设置为跟浏览器一样
      设置延时爬取单个页面或者通过代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值