• 使用nodejs爬取静态网页数据


    尝试来做一个爬虫的教程, 很大概率是一个系列教程, 分为静态页面, 动态页面, 无头浏览器 三个方向开始

    简介

    主要是分享一下, 也算是自己记一个笔记吧, 我们来找一个静态的网站 找个比较有意义的: https://www.zhipin.com/job_detail/?query=&city=101120100&industry=&position=100901 爬取济南的boos直聘列表信息
    首先声明的是boos直聘拥有一部分的反扒, 高频次的访问会要求输入验证码, 这次教程不会写, 之后的打算也不会写, 需要的话自己去了解.
    本文章仅限于交流学习使用, 不允许运用于违法违规等地方, 本人不承担一切后果

    毕竟爬虫是违法的

    准备

    • 如何区分是动态渲染还是静态页面,可以查看一下源代码,源代码中有列表信息或你需要的信息就是静态的,如果没有列表信息,那么就是通过接口请求然后渲染的,这个应该是都理解的
    • 你需要安装nodejs的环境
    • 你需要一个编辑器~~~~
    • 你需要一个终端框
    • 你需要基本的js基础
    • 你需要jquery基础
    • 你需要axios基础
    • 你需要会使用命令行
    • 你需要会使用node运行js文件
    • 你需要会使用npm或yarn
    • 你需要一个脑子
      如果你不会或没有以上的某个或者多个东西,希望你可以补一些基础再过来

    创建

    你可以在任何地方创建一个js文件(你拥有最高权限的话)
    并没有任何想发布或者封装为包的想法,将不进行npm init

    尝试命名为main.js 的文件 比如在桌面
    image.png
    然后打开命令行,小黑框。linux下可以使用ctrl+alt+t,windows下使用徽标+r 然后输入cmd,mac没用过,不知道
    你会获得一个这东西
    image.png
    然后打开桌面
    linux中文环境可以直接cd 桌面 如果不行可以cd Desktop
    windows 下cd Desktop
    然后回车。
    我们需要一个包,叫做 cheerio
    使用npm安装
    npm install cheerio 或yarn yarn add cheerio
    然后需要网络请求的包 axios 安装同上

    使用

    安装完成之后 打开创建的main.js
    然后引入这两个包

    const axios = require('axios')
    const cheerio = require('cheerio')
    

    通过axios访问上面的网址

    axios.get('https://www.zhipin.com/job_detail/?query=&city=101120100&industry=&position=100901').then((res)=>{
        console.log(res.data)
    })
    

    使用cmd 运行 node ./main.js 然后就会输出页面信息了
    然后接下来就是使用cheerio了 接上面代码的
    let dom = cheerio.load(res.data);console.log(dom('title').text())
    cheerio.load 加载一段html 解析成一个结构,你现在可以理解为这样 接下来就可以跟使用jquery一样了
    如果你不明白 你可以这样
    let $ = cheerio.load(res.data);console.log($('title').text())
    这样就可以很好理解了。
    然后 你会发现 输出信息会是加载中。
    那么接下来 你需要传一个cookie上去
    完整代码如下

    const axios = require('axios')
    const cheerio = require('cheerio')
    axios.get('https://www.zhipin.com/job_detail/?query=&city=101120100&industry=&position=100901',{headers:{
        cookie: 'lastCity=101120100; __zp_seo_uuid__=e18d8f7b-6c6f-4706-bfef-61c155d50c81; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1583497382,1584362054,1585650181; __c=1585650181; __g=-; __l=l=%2Fwww.zhipin.com%2Fjinan%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; __zp_stoken__=6349tRPT%2B%2FZRuGAtTm9brIZTycgp8FhwkY%2BXWwZOoum8MYdM2EVIU20N6leGhELWjB9YyvNy1s%2Bf2RUTphzSSqiQuUzR8rVhtNuOHDp1Q7rD7z0V9hNHJ%2F5eNBgltnVn4bYd; __a=38005021.1583497382.1584362053.1585650181.11.3.3.11; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1585650199; __zp_sseed__=Yii38ZCE2lVjTVMJ4r+tgZUxi/pSy3WLbXUyd5+f53E=; __zp_sname__=8285564b; __zp_sts__=1585651819105'
    }}).then((res)=>{
        // console.log(res.data)
        let dom = cheerio.load(res.data)
        console.log(dom('title').text())
    })
    

    那么这样就可以正常输出页面title了 为什么 ? 百度,网站反扒解决办法
    那么接来来就简单了,我就以获取所有的职位标题为例,演示一下
    image.png
    页面的list信息是被这个div标取的 我们选中这个class下面的ul 然后他下面的ls就是所有的信息
    完整代码

    const axios = require('axios')
    const cheerio = require('cheerio')
    axios.get('https://www.zhipin.com/job_detail/?query=&city=101120100&industry=&position=100901',{headers:{
        cookie: 'lastCity=101120100; __zp_seo_uuid__=e18d8f7b-6c6f-4706-bfef-61c155d50c81; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1583497382,1584362054,1585650181; __c=1585650181; __g=-; __l=l=%2Fwww.zhipin.com%2Fjinan%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&friend_source=0; __zp_stoken__=6349tRPT%2B%2FZRuGAtTm9brIZTycgp8FhwkY%2BXWwZOoum8MYdM2EVIU20N6leGhELWjB9YyvNy1s%2Bf2RUTphzSSqiQuUzR8rVhtNuOHDp1Q7rD7z0V9hNHJ%2F5eNBgltnVn4bYd; __a=38005021.1583497382.1584362053.1585650181.11.3.3.11; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1585650199; __zp_sseed__=Yii38ZCE2lVjTVMJ4r+tgZUxi/pSy3WLbXUyd5+f53E=; __zp_sname__=8285564b; __zp_sts__=1585651819105'
    }}).then((res)=>{
        // console.log(res.data)
        let $ = cheerio.load(res.data)
        // console.log(dom('title').text())
        $('.job-list ul li').each((index,dom)=>{
            console.log($(dom).find('.job-name a').text())
        })
    })
    

    运行会输出
    image.png
    然后就基本完结了,如果了解jquery的话,你想获取什么简直易如反掌。
    有不会的东西欢迎留言。

  • 相关阅读:
    go语言Notepad++简易开发环境搭建(windows)
    openssl AES加密以及padding
    为什么数据库要读写分离
    关于查询服务器文件是否过期的分析
    linux 禁止指定账号ssh登陆
    libmemcached upcoming ISO C++ standard, C++0x
    keepalived安装配置(nginx)
    php连接mysql报错No such file or directory
    linux命令行下使用R语言绘图
    纯真IP数据库导入mysql
  • 原文地址:https://www.cnblogs.com/pplok/p/12614398.html
Copyright © 2020-2023  润新知