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)
    • 編寫單個數據獲取的案例
    • 遇到阻礙,進行反爬對抗
      將請求頭設置爲跟瀏覽器一樣
      設置延時爬取單個頁面或者通過代理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章