背景

周末帮女友手查的各大厂薪资情况,忙活了一个下午,真的是好无聊啊,所以决定写一个爬虫程序,自动爬取。

图片offershow界面,以下采用秀代替offer秀

因为本人本地开发环境是golang,所以还是采用golang,需求目标是爬取各大厂的薪资情况生成excel文档,用户可以输入筛选条件,如公司、学校、学历等信息,然后只输出筛选后的数据。

抓包分析

爬虫最重要的一步,抓包分析http请求包括头和相应报文内容,因为我们爬虫时就是需要构造http请求报文和解析响应报文。其次爬微信小程序和爬web网页没有什么区别,只是网页版可以使用浏览器F12抓包,但是微信小程序相当于一个APP,需要采用抓包工具来抓包分析,抓包工具有很多,这里选择charles抓包,charles是专门的针对http和https的抓包工具,并且可以设置SSL代理,可以显示https的报文明文内容。

charles设置SSL代理,offer秀采用https协议:

  1. 安装charles SSL根证书

    帮助->SSL代理->安装charles root证书->常规->安装证书->本地计算机->将所有证书放到下列存储->受信任的证书颁发机构

  2. SSL代理设置PC本机为代理

    代理->SSL代理设置->SSL代理->添加

    主机: *.*

    端口: 443

打开电脑短微信小程序offer秀,并点击华为等大厂,查看offer情况,然后charles抓包查看请求和响应

抓包结果

请求

头部:

POST //webapi/v2/search_salary HTTP/1.1
Host: www.ioffershow.com
Connection: keep-alive
Content-Length: 221
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat
content-type: application/x-www-form-urlencoded
Referer: https://servicewechat.com/wx67fbba6cd94591e4/44/page-frame.html
Accept-Encoding: gzip, deflate, br
  1. 采用POST方法
  2. URI目录是/webapi/v2/search_salary,所以url全名为https://www.ioffershow.com/webapi/v2/search_salary
  3. 代理设置为有微信标识的,爬虫是头部参数构造和该报文完全一致

body:

content=%E5%8D%8E%E4%B8%BA&search_priority=1&ordertype=2&part_school=&year=&education=%E5%85%A8%E9%83%A8&access_token=%24ytkzhLIvv5%2BsYwytrpIDkg26d4HQpxjr6pCoffershowzju1qaz.1626568859971.15aeb732580bc4957cddcb71075cef51

body中主要是查询信息,如公司名、学历等,其中中文是unicode编码,charles显示会乱码,如

content=%E5%8D%8E%E4%B8%BA, 该乱码字符串就是中文字符“华为”。可以采用url编码在线转换工具,转换成中文显示。

另外注意有token信息,那么token生成规则是什么样的呢?很难去查证,不过经过本人实验,好像服务器并没有做token验证,但是得有access_token这个字段, 所以access_token值可以为任意字符串,这里我们还是使用和上述一样的值。爬虫中请求报文构造以上字符串作为http的body即可。

响应报文

响应报文是json字符串,其中info数组中保存的是每个人的信息,不过其中有发布人ip的字段。。。看来offer秀也是留了个后门啊。。。匿名了,也没有完全匿名。

响应报文处理解析json字符串,得到每个人的信息即可。

代码

我们的目标是做一个比较简单的爬虫,能爬取到网页内容,并保存下来即可,并不追求性能。步骤

  1. 构造http请求
  2. 接收http响应
  3. 字符集转换unicode转utf8
  4. json解析
  5. 保存数据到csv文件(这里为了处理方便,采用csv文件)

上代码

package mainimport ("bytes""github.com/tidwall/gjson""io/ioutil""os""strconv""strings""time""unsafe""fmt""log""net/http"
)/*筛选条件:岗位, 公司,地点, 学历, 学校*/func ParseCompay(company string) {//var bodyStr = "content=字节&search_priority=1&ordertype=2&part_school=&year=&education=全部&access_token=%24ytkzhLIvv5%2BsYwytrpIDkg26d4HQpxjr6pCoffershowzju1qaz.1626486167795.e7c54cdc68aac7b8dcedff91f09e204c"queryStr := "content=" + company + "&search_priority=1&ordertype=2&part_school=&year=&education=全部&access_token=%24ytkzhLIvv5%2BsYwytrpIDkg26d4HQpxjr6pCoffershowzju1qaz.1626486167795.e7c54cdc68aac7b8dcedff91f09e204c"client := &http.Client{}req, err := http.NewRequest("POST", "https://www.ioffershow.com/webapi/v2/search_salary", bytes.NewBufferString(queryStr))if err != nil {log.Fatalln(err)}req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat")req.Header.Set("content-type", "application/x-www-form-urlencoded")req.Header.Set("Referer", "https://servicewechat.com/wx67fbba6cd94591e4/44/page-frame.html")req.Header.Set("Accept-Encoding", "gzip, deflate, br")resp, err := client.Do(req)if err != nil {log.Fatalln(err)}defer resp.Body.Close()if resp.StatusCode != http.StatusOK {fmt.Errorf("wrong status code",resp.StatusCode)}respBytes, err := ioutil.ReadAll(resp.Body)str := (*string)(unsafe.Pointer(&respBytes))result := unicode2utf8(*str)fmt.Println(result)infoList := gjson.Get(result,"info")if infoList.Exists(){/*open file: company_date_time.csv*/timeNow := time.Now()fileName := company + "_" + timeNow.Format("20060102150405") + ".csv"file , err := os.Create(fileName)if err != nil {fmt.Println("open file failed!")return}defer file.Close()file.WriteString("id, 公司, 职位, 工资, 城市, ip, 行业, 学历, 工资类型, 工资上限, 工资下限, 可信度, 时间, 附加\r\n")re:= infoList.Array()for _, v := range re {id := v.Get("id").String()company :=v.Get("company").String()position := v.Get("position").String()salary := v.Get("salary").String()city := v.Get("city").String()remark := v.Get("remark").String()ip := v.Get("ip").String()hangye := v.Get("hangye").String()xueli := v.Get("xueli").String()salarytype := v.Get("salarytype").String()salary_upper := v.Get("salary_upper").String()salary_lower := v.Get("salary_lower").String()is_delete := v.Get("is_delete").String()score := v.Get("score").String()time := v.Get("time").String()println("=================================")println("id: ", id)println("company: ", company)println("position: ", position)println("salary: ", salary)println("city: ", city)println("remark: ", remark)println("ip: ", ip)println("hangye: ", hangye)println("xueli: ", xueli)println("salarytype: ", salarytype)println("salary_upper: ", salary_upper)println("salary_lower: ", salary_lower)println("is_delete: ", is_delete)println("score: ", score)println("time: ", time)println("=================================")/*保存到文件中*/file.WriteString( id + "," + company + "," + position + "," + salary + "," + city + "," + ip + "," + hangye + "," + xueli +"," + salarytype + "," + salary_upper + "," + salary_lower + "," + score + "," + time + "," + remark + "\r\n")}}
}func unicode2utf8(source string) string {var res = []string{""}sUnicode := strings.Split(source, "\\u")var context = ""for _, v := range sUnicode {var additional = ""if len(v) < 1 {continue}if len(v) > 4 {rs := []rune(v)v = string(rs[:4])additional = string(rs[4:])}temp, err := strconv.ParseInt(v, 16, 32)if err != nil {context += v}context += fmt.Sprintf("%c", temp)context += additional}res = append(res, context)return strings.Join(res, "")/*json*/
}func main() {companyList := []string{"百度", "字节", "腾讯", "阿里", "tplink"}for _, campany:= range companyList {ParseCompay(campany)}
}

golang自带的json库只能解析固定struct的json,使用起来还是很不方便的,这里json解析采用的是gjson。

可以使用命令下载

go get github.com/tidwall/gjson

golang微信小程序爬虫教程offer秀相关推荐

  1. 基于云开发的微信小程序实战教程(二)

    基于云开发的微信小程序实战教程(二) 上篇文章中,简单介绍了下小程序云开发的概念,还有开发工具的安装和配置,云开发环境已经搭建完毕. 本章主要内容:微信开发者工具如何使用,小程序云开发的基础目录结构 ...

  2. 微信小程序开发分销制度济南_花店微信小程序开发教程

    如何将自己的鲜花商品快速配送出去,避免鲜花过期浪费,是很多传统花店商家的难题.不过随着微信小程序的出现,这一难题也渐渐得到了解决.花店商家可以通过自己的小程序商城,打通线上渠道,可以加大推广.扩大销量 ...

  3. 微信小程序开发教程第七章:微信小程序编辑名片页面开发

    前面我们更新了六篇的微信小程序开发教程,现在更新第七章:微信小程序编辑名片页面开发,(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程 ...

  4. 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现

    接着上面微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现.(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程序名片夹详情页开 ...

  5. 小程序开发用什么编程语言_微信小程序开发教程是什么?费用多少?

    微信小程序如今已经非常常见,渗透到了我们日常生活的方方面面,包括生活服务.出行.点餐.电商购物.企业展示--商家可以开发适合自己行业的小程序,以吸引线上用户,同时提高自身服务运营效率.不过这些不同种类 ...

  6. 微信小程序开发语言(微信小程序开发教程)详细步骤

    微信小程序开发语言 开发微信小程序用什么语言 1.微信小程序开发所需要的语言比较特别,首先介绍一下需要使用到的文件类型大致分为:WXML(WeiXin Mark Language 微信标记语言).WX ...

  7. 微信小程序入门教程+案例demo

    微信小程序入门教程+案例demo 尊重原创,转载请注明出处:原文查看惊喜更多 http://blog.csdn.net/qq137722697 首先摆在好姿态,--微信小程序开发也就那么回事.你只需要 ...

  8. 微信小程序操作教程(个人用户注册)

    一.注册账户 注册地址:https://mp.weixin.qq.com 1.邮箱注册 注意:每个邮箱只能注册一个小程序账户:邮箱即用户名 请记录用户名及密码 2.邮箱激活:点击链接激活账号 3.信息 ...

  9. 个人怎么制作微信小程序,微信小程序可以免费制作吗?微信小程序制作教程

    微信小程序 微信小程序,小程序的一种,英文名Wechat Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或搜一下即可打开应 ...

  10. 从零开始的微信小程序入门教程(一)

    从零开始的微信小程序入门教程(一) 之前说要和同事一起开发个微信小程序项目,现在也在界面设计,功能定位等需求上开始实施了.所以在还未正式写项目前,打算在空闲时间学习下小程序.本意是在学习过程中结合实践 ...

最新文章

  1. 十年后,这是25个你会习以为常的AI应用场景
  2. linux c chmod 更改权限函数
  3. Gradle 6.6 发布,引入配置缓存特性,大幅提升构建性能
  4. JSON与JAVA数据的相互转换(基本应用)
  5. windows 2008r2文件服务器部分用户访问不了_苹果设备如何访问 Windows 文件共享?...
  6. 驳《阿里「Java开发手册」中的1个bug》?
  7. php框架大全图解_PHP框架汇总 - 鱼煎的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 【DS】线段树HDU-1166
  9. 派克dselite调试软件安装_派克ETH电动缸的新专利减少了调试和维护时间
  10. 春运首日 广西桂林火车站向旅客“送万福”
  11. 超级整理术--读后笔记
  12. 串口服务器485转以太网
  13. 怎么把度分秒化成小数_度分秒转换成小数
  14. HCIA--华为认证初级网络工程师
  15. 关于不同长度PEG的丙炔:Pyrene-PEG2/PEG3/PEG4/PEG5-propargyl,1817735-33-3
  16. dell台式计算机主板电池,台式机主板电池怎么拆
  17. 特征图注意力_深度学习入门之注意力机制
  18. select into from 和 insert into select的使用
  19. 绿卡日记:2020-12-28
  20. 双方博弈复制动态方程(y-z,z=0.3,z=0.5,z=0.7)与matlab数值仿真——matlab2016a版本

热门文章

  1. JS导出excel表格
  2. MYSQL数据库使用手册
  3. ym——android源码大放送(实战开发必备)
  4. 社团挖掘算法——BGLL算法
  5. FPGA入门 Xilinx暑期学校学习Day4
  6. 判断是否为回文字符串
  7. 使用PLSQL导出oracle表结构,表数据;导入数据
  8. python 斯皮尔曼相关系数_斯皮尔曼等级相关系数(Spearmansrankcorrelationcoefficient)
  9. otool介绍(转http://www.mc2lab.com/?p=68)
  10. STM32 vcap引脚