爬虫逆向实战(27)-某某招标投标网站招标公告(webpack、图片验证码)

一、数据接口分析

主页地址:某网站

1、抓包

通过抓包可以发现数据接口是page
在这里插入图片描述

2、判断是否有加密参数

  1. 请求参数是否加密?
    通过查看“载荷”模块可以发现,请求参数是一整个密文
    在这里插入图片描述
  2. 请求头是否加密?
  3. 响应是否加密?
    通过查看“响应”模块可以发现,响应数据是加密的
    在这里插入图片描述
  4. cookie是否加密?

二、加密位置定位

1、看启动器

查看启动器发现里面包含异步,所以无法正确找到加密位置
在这里插入图片描述

2、搜索关键字

因为加密参数是一整个密文,所以无法搜索关键字

3、hook

因为“载荷”是一整个密文,所以网站大概率会使用JSON.stringify将数据转换为json字符串再进行加密,所以我们可以hookJSON.stringify,hook代码:

var my_stringify = JSON.stringify;
JSON.stringify = function (params) {
    debugger
    console.log("json_stringify params:",params);
    return my_stringify(params);
};

运行hook代码,再次点击翻页,发现可以断住
在这里插入图片描述
接着调试执行,我们就可以找到加密位置了,并且可以看到,在下面的回调方法中对响应进行了解密操作。
在这里插入图片描述

三、解决密钥

1、分析网站密钥的获取

在定位到加密以及解密位置后,我们可以看到网站加解密时需要密钥,并且网站的密钥获取是从本地存储中获取logo1logo2
在这里插入图片描述
所以我们可以通过hooklocalStorage.setItem来找到网站是怎么生成的这两个参数。
hook代码:

var my_setItem = localStorage.setItem;
localStorage.setItem = function (key, value) {
    debugger
    return my_setItem.call(localStorage, key, value);
};

同时,为了让网站可以再次生成这两个参数,我们需要先将本地存储中的删除。在控制台中,进入“应用”这个标签页,再点击“本地存储空间”,然后点击清除按钮,就可以清除了。
在这里插入图片描述
然后运行hook脚本,点击浏览器上方的后退按钮。注意:此处不能刷新页面,因为刷新页面hook代码将不再运行,同时,此网站是在首页向本地存储中放入的参数,所以我们要回退到首页生成。
在这里插入图片描述
点击回退后,发现可以断住
在这里插入图片描述
接着调试执行,我们就可以找到网站设置的位置了,同时,可以发现这个位置好像是在一个回调中。
在这里插入图片描述
再次观察发包,可以发现网站确实是从一个bj.css的响应中提取的。所以我们就可以通过请求这个接口,按照网站的提取方法提取出密钥,或者自己写正则表达式将密钥提取出来。
在这里插入图片描述

四、验证码

1、获取数据错误

在扣完js之后,我们发送请求会发现,获取到的数据与网站抓包获取到的数据不太一致,网站抓包获取到的数据是一整个密文,而我们获取到的数据是一个json数据并且code是511
在这里插入图片描述
在这里插入图片描述
此时我们再次回到网站,发现网站在收到code为511的响应时,会出现一个验证码
在这里插入图片描述

2、处理验证码

点击刷新验证码可以发现,网站是发送一个请求cms/validateCode/undefined获取的验证码,响应中的data是base64编码的图片数据。
在这里插入图片描述
当我们输入一个错误的验证码时,可以发现,网站是将我们输入的内容拼接到路径中进行请求。
在这里插入图片描述
所以我们可以先请求undefined接口获取到一个验证码,然后破解验证码(我是使用的第三方打码平台),将破解的验证码拼接到路径中,再次发送请求,然后再获取数据即可。

五、扣js

将加密以及解密位置的代码扣出,缺啥补啥即可。
该网站使用的是webpack,我们可以发现,网站加密时使用的lm都是来自于webpack中的模块,
在这里插入图片描述
所以我们可以在f = n("e2b4")打断点,然后进入到n方法中,扣出加载器,然后再将需要的模块扣出即可。

六、源代码

js源代码因为字数太多无法上传,所以就放在了资源中,在文章最上方点击“立即下载”即可
在这里插入图片描述

python源码:

"""
Email:912917367@qq.com
Date: 2023/8/29 11:41
"""
import time

import execjs
import requests

from utils.chaojiying import ChaojiyingClient


class Spider:
    def __init__(self):
        self.session = requests.session()
        self.session.headers = {
            "MACHINE_CODE": str(int(time.time() * 1000)),
            "Origin": "https://www.cnpcbidding.com",
            "Referer": "https://www.cnpcbidding.com/",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
        }
        with open('reverse.js', 'r', encoding='utf-8') as f:
            self.js_obj = execjs.compile(f.read())
        self.bj = ''
        self.pic_str = ''

    def get_bj(self):
        url = "https://www.cnpcbidding.com/cms/css/bj.css"
        response = self.session.get(url)
        self.bj = response.text

    def get_img_code(self):
        url = "https://www.cnpcbidding.com/cms/validateCode/undefined"
        response = self.session.get(url)

        cjy = ChaojiyingClient('lan8sjk', 'lan8@2023', '946014')
        pic_data = cjy.post_pic_base64(response.json()['data'], 6001)
        self.pic_str = pic_data['pic_str']

        url = "https://www.cnpcbidding.com/cms/validateCode/" + str(self.pic_str)
        response = self.session.get(url)

        print(response.text)
        print(response)

    def get_data(self):
        data = self.js_obj.call('get_params', self.bj)
        self.session.headers['Content-Type'] = "application/json;charset=UTF-8"
        url = "https://www.cnpcbidding.com/cms/article/page"
        response = self.session.post(url, data=data)
        data = self.js_obj.call('get_data', self.bj, response.text)
        print(data)


if __name__ == '__main__':
    s = Spider()
    s.get_bj()
    s.get_img_code()
    s.get_data()

招标搜索软件使用说明 软件使用类似于百度的蜘蛛引擎,每日爬行全国招标信息、政府采购类网站,从中提取出各类有效的招标数据或政府采购信息,用户下载我们的招标搜索软件,免安装即可搜索使用,就可搜索到全国最新的各类招标中标政府采购等信息,从而为企业解决了在获取各类招投标信息时,渠道单一、只使用某一或几个网站进行搜索、导至错失大量有用信息无法知晓。软件在操作上、我们力求以最简单的操作方式来达到最理想的搜索结果,您只需要选择几个不同的搜索条件,即可让你看到意想不到的信息。 采购招标信息 政府网站(公共资源交易中心,政府采购中心)、大型企业网站、代理机构网站等机构采购招标信息,会员(采购商)自主发布采购招标信息,供用户查询。内容包含投标要求、业主、招标公司联系人、联系方式、及购买标书的时间、地点等,每日更新公开招标信息。 政府采购 各省、市、县政府采购单位发布的询价类、比选、竞争性谈判及单一来源采购类信息。 企业采购 国内各大企业、集团公司所发布的直接采购信息,用户可通过非招标的形式,直接和业主方联系,洽谈供货及长期合作事宜。 会员招标采购 中机采招网广大用户发布的招标信息,包括招标内容、采购单位以及联系人、联系方式。中机采招网可推荐符合采购单位要求的认证企业前去参与。 变更通知 是在发布招标公告后补充公告、变更公告、废标公告、重新招标等信息,使用户可以及时获知,并有效的对投标工作做出相应方案调整,以免因此导致投标失误。 标书下载 部分招标项目可向用户提供电子版标书下载服务,标书内容包含项目采购清单、商务文件、技术参数、评标办法、报名表等,省去因盲目购买标书而损失的财力和时间成本。 中标信息 政府网站(公共资源交易中心,政府采购中心)、大型企业网站、代理机构网站等机构中标信息,供用户查询。提供中标单位、中标项目、中标金额,为会员提供直接供货渠道。更有利于会员为中标企业在后期分包工作中,做好提前介入工作。 招标数据查询 中机采招网庞大招标数据信息,可为用户提供历史招标数据,统计、导出、分析提供相关数据支持。 中标数据查询 中机采招网庞大中标数据信息,可为用户提供历史中标数据,内容包含采购单位、中标单位、中标金额等,对用户的数据统计、导出、分析提供相关数据支持。 项目导出 用户可针对中机采招网项目库中所感兴趣的项目,按地区和时间进行分别汇总,并导出保存在本地电脑上进行存档备案。 数据库 (招标) 根据用户需求,以表格形式汇总近一个月内各行业、各领域招标采购数据信息,为用户做数据分析提供支持服务。 数据库 (中标) 根据用户需求,以表格形式汇总近一个月内各行业、各领域中标数据信息,为用户做数据分析提供支持服务。 数据库 (企业) 供包含业主、招标代理机构及相关单位、供应商、政府采购中心等企业数据库在线查询服务。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值