尝试来做一个爬虫的教程, 很大概率是一个系列教程, 分为静态页面, 动态页面, 无头浏览器 三个方向开始
简介
主要是分享一下, 也算是自己记一个笔记吧, 我们来找一个静态的网站 找个比较有意义的: 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
的文件 比如在桌面
然后打开命令行,小黑框。linux下可以使用ctrl+alt+t,windows下使用徽标+r 然后输入cmd,mac没用过,不知道
你会获得一个这东西
然后打开桌面
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了 为什么 ? 百度,网站反扒解决办法
那么接来来就简单了,我就以获取所有的职位标题为例,演示一下
页面的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())
})
})
运行会输出
然后就基本完结了,如果了解jquery的话,你想获取什么简直易如反掌。
有不会的东西欢迎留言。