吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6605|回复: 39
收起左侧

[Python 原创] 前程无忧最新岗位招聘爬虫简单逆向分析思路-2023.3.1

  [复制链接]
xcngg 发表于 2023-3-1 21:20
本帖最后由 xcngg 于 2023-3-3 16:20 编辑

51job 招聘岗位爬虫逆向

新人帖,佬勿喷

抓取站点:前程无忧
在线工具: 在线HmacSHA256

最近发现之前写的前程无忧岗位爬虫的代码没法用了,上去看了一眼,好家伙,网页渲染方式果然又又又更新了,之前的岗位数据是直接放在源码里的,现在放在了接口里。

用F12浅浅抓个包,就能很快找到找到接口。

f12接口寻找.png

这个接口是get请求方式,直接请求一下接口,发现鉴权失败,签名错误,昂,果然有反爬措施。

签名错误.png

回去看看接口的请求头部分,熟悉的大佬们一眼就能看出这个sign非常可疑,结合刚刚的错误提示,可以知道,sign就是signature 即签名的缩写。

signature.png

按下Ctrl+Shift+F,搜索下sign

sign搜索.png

可以看到有一大堆文件包含了sign这个单词,首先排除css文件,这种加密的参数大概率是由js文件生成的。

在搜索出来的js文件中再不断搜索关键词sign,可以看到

return e.headers.sign = p.a.HmacSHA256(t, s["a"].state.commonStore.cupid_sign_key),

这块地方设置了headers.sign属性,并且,这里使用了HmacSHA256加密方式,这和我们需要破解的请求头sign参数是相关联的,所以可以尝试一下,在前面打个断点,再搜索一次其他岗位,看看会不会断住。

sign搜索到关键参数.png

可以看到,我们成功断点断住了。

js控制台参数分析.png

在控制台里看一下加密方法中的参数

t'/open/noauth/search-pc?api_key=51job×tamp=1677644880&keyword=python%E5%AE%9E%E4%B9%A0%E7%94%9F&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=°ree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=1&requestId=&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'

s["a"].state.commonStore.cupid_sign_key:'abfc8f9dcf8c3f3d8aa294ac5f2cf2cc7767e5592590f39c3f503271dd68562b'

很明显,t是请求的路径,那么s["a"].state.commonStore.cupid_sign_key 是什么呢?

key是静态.png

我们在这个js文件中查看一下,可以看到,key是静态不变的,就是一个前端写好的加密密钥。

得到这样的结果,我们用在线HmacSHA256加密一下这两个参数,看看和这次请求的sign是否对应

在线hmac256.png

再看看这次请求的参数

sign加密参数.png

没错,一毛一样,基本完工。

这里需要注意的是,每次搜索时,会对当前的关键词进行url编码

url编码.png

可以拿在线工具对比一下。

在线url编码.png

接下来给出Python实现的爬虫代码,这里把数据存储为了csv文件。

import hmac
from hashlib import sha256
import time
import requests
from urllib.parse import quote
import pandas as pd

# 实现 返回 hmac_sha256 算法
def hmac_sha256(key, value):
    message = value.encode('utf-8')
    return hmac.new(key.encode('utf-8'), message, digestmod=sha256).hexdigest()

# 抓取数据
# 参数为需要搜索的招聘信息内容,页码
def get_data(search,page):
    target = "https://cupid.51job.com"
    # hmac_sha256 密钥
    key = "abfc8f9dcf8c3f3d8aa294ac5f2cf2cc7767e5592590f39c3f503271dd68562b"
    # hmac_sha256 加密信息 时间戳 搜索的关键词
    value = f"/open/noauth/search-pc?api_key=51job×tamp={str(int(time.time()))}&keyword={search}&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=°ree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum={page}&requestId=&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb"
    # 请求头
    headers = {
        "sign": hmac_sha256(key, value),
    }
    print("sign:",headers['sign'])
    # 获取响应 json 格式化
    response = requests.get(url=target+value,headers=headers).json()
    return response

# 生成csv
# 参数 csv文件名,csv数据
def generate_csv(file_name,data):
    csv_data = pd.DataFrame(data)
    csv_data.to_csv(f"./{file_name}.csv")

def main():
    #岗位
    search_word = "python实习生"
    # 最后的csv的数据
    result = list()
    # 对关键词进行url编码 否则无法实现中文爬虫
    # 翻页
    for page in range(1,10):
        job_data = get_data(search=quote(search_word), page=page)["resultbody"]['job']["items"]
        print(f"[Success] Crawler Page:{page} | OVER",)
        result += job_data
    # 生成csv
    generate_csv(file_name=search_word, data=result)
    print(f"[Success] Generate-Csv {search_word}.csv | OVER")

if __name__ == "__main__":
    main()

看到评论反馈,发现上传帖子后value的变量值还有一些源码内容会发生改变

所以大家直接参考源码截图吧

code.png

有需要也可以直接下载源码
51jobs.zip (215.91 KB, 下载次数: 101)

运行效果

运行效果.png

csv预览

csv预览.png

免费评分

参与人数 11威望 +1 吾爱币 +20 热心值 +9 收起 理由
ppx32147 + 1 谢谢@Thanks!
redballoon + 1 + 1 谢谢@Thanks!
hubery2023 + 1 + 1 我很赞同!
shihdhr + 1 + 1 学习到了,下次遇到静态的秘钥可以试试
苏紫方璇 + 1 + 10 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
nullable + 2 用心讨论,共获提升!
小傲宇 + 1 + 1 我很赞同!
专属曲丶 + 1 + 1 我很赞同!
Mr.救赎 + 1 学习了数据分析
liuman02 + 1 + 1 用心讨论,共获提升!
两只小蜜蜂 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

cflying 发表于 2023-3-2 10:34
嗯嗯,不错不错,其实如果爬多了,后面还有个验证页面。
 楼主| xcngg 发表于 2023-3-2 18:52
本帖最后由 xcngg 于 2023-3-2 18:57 编辑
117467746 发表于 2023-3-2 17:17
为什么sign这里我下断点 断不下来 请教

我记得有两个 return e.headers.sign =  p.a.DHmacSHA256(t,s["a"].state.commonstore.cupid_sign_key) 生成的地方 有个地方断点是不执行不生效的,所以可以在存在sign的js文件里ctrl+f 搜索一下sign(会有20左右个结果) 然后找一下另一个相似的地方加上断点尝试一下 哪个执行就是哪个地方是生成加密的地方
或者是断点的地方是正确的 需要在网页内搜索一下不一样的岗位关键词 因为相同的关键词这个网站是不会再次执行搜索的
希望对你有帮助
liuman02 发表于 2023-3-2 08:31
本帖最后由 liuman02 于 2023-3-2 08:34 编辑

感谢分享。正适合我这样的小白看。
如果把工具那些网址放上就更完美了。
Asdeo 发表于 2023-3-2 08:54
有工具安装包就更完美了
lansemeiying 发表于 2023-3-2 09:14
这个好,回去试试
debug_cat 发表于 2023-3-2 09:43
感谢分享。正适合我这样的小白看。
117467746 发表于 2023-3-2 17:17
为什么sign这里我下断点 断不下来 请教
 楼主| xcngg 发表于 2023-3-2 18:59
cflying 发表于 2023-3-2 10:34
嗯嗯,不错不错,其实如果爬多了,后面还有个验证页面。

是的是的 之前的51是有阿里云盾滑块的 最近这个版本的51可能我脸白好像没有触发过
117467746 发表于 2023-3-3 05:42
xcngg 发表于 2023-3-2 18:52
我记得有两个 return e.headers.sign =  p.a.DHmacSHA256(t,s["a"].state.commonstore.cupid_sign_key)  ...

感谢 是有两个 在第二个可以
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 16:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表