网站链接:aHR0cHM6Ly9iaWRkaW5nLnNpbm9wZWMuY29tL3RwZnJvbnQveHhnZy8wMDQwMDEv

目标:抓取十页数据

1.抓包

中石化js逆向分析_js逆向


先是请求了url,然后请求接口,获取到列表数据

中石化js逆向分析_python_02


看到cookie的几个参数比较可疑

中石化js逆向分析_中石化_03


请求首页的表单数据只有一个

那我请求其他页呢?

中石化js逆向分析_抓包_04


这几个数比较可疑

__EVENTARGUMENT: 表示要请求的页数

MoreinfoListsearch1$Pager_input: 表示跳转之前的页数

__VIEWSTATE: 应该是base64加密

不得不说,这个网站是真慢

2.分析js

中石化js逆向分析_抓包_05


可以看到index页面只是一个header与footer,没有数据

观察请求数据的url后,大胆猜测在/tpfront/CommonPages

中石化js逆向分析_数据_06


中石化js逆向分析_抓包_07


中石化js逆向分析_数据_08

大致看一下源码,里面有列表页的数据,和提交数据的代码,用的同步方式

打上断点

中石化js逆向分析_数据_09


在按下下一页的时候会立即在断点处断下来,

中石化js逆向分析_抓包_10


升级了新版chrome对逆向很友好。爱了爱了

中石化js逆向分析_数据_11


单步步过309行后发出请求

中石化js逆向分析_中石化_12


忽略断点,执行,再按新的一页,断在原来位置,在控制台输入

中石化js逆向分析_python_13


这些参数,然后发现有输出

中石化js逆向分析_python_14


放开断点对比一下抓包的数据和这个一样吗

发现一样。

在页面中搜索这个值,

中石化js逆向分析_js逆向_15


发现是写死的,页面应该是服务器返回的

然后看请求头

中石化js逆向分析_js逆向_16


多抓几次包,发现cookie不是动态的。

接下来就简单了

代码

#!usr/bin/env python
# coding:utf-8
"""
 @File  :中石化.py
 @Author:小生
 @date  : 2021-06-21 16:42
"""
import requests
import re
cookies = {
    'tpfront': '',
    'ASP.NET_SessionId': 'hzruz3gz02g51rg2epnzapt4',
    'BIGipServerPOOL_DZPT_5': '1405354506.20480.0000',
}

headers = {
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'sec-ch-ua': '^\\^',
    'sec-ch-ua-mobile': '?0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
    'Accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'no-cors',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'image',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Referer': '',
}
data = {
    'CategoryNum': '004001'
}

url = 'https://bidding.sinopec.com/tpfront/CommonPages/searchmore.aspx?CategoryNum=004001'
# 请求首页数据,因为首页要求的和后面不一样
response = requests.get(url, headers=headers, cookies=cookies, data=data)


def request_pag(x, response):
    __EVENTARGUMENT = str(x)
    __VIEWSTATE = \
        re.findall(r'<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)" />', response.text,
                   re.M | re.I)[0]
    __VIEWSTATEGENERATOR = \
        re.findall(r'name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="(.*?)" />', response.text,
                   re.I | re.M)[0]
    __EVENTTARGET = 'MoreinfoListsearch1$Pager'
    __EVENTVALIDATION = \
        re.findall(r'<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*?)" />',
                   response.text,
                   re.M | re.I)[0]
    data['__EVENTARGUMENT'] = __EVENTARGUMENT
    data['__VIEWSTATE'] = __VIEWSTATE
    data['__VIEWSTATEGENERATOR'] = __VIEWSTATEGENERATOR
    data['__EVENTTARGET'] = __EVENTTARGET
    data['__EVENTVALIDATION'] = __EVENTVALIDATION
    if x <= 2:
        pass
    else:
        data['MoreinfoListsearch1$Pager_input'] = str(x-1)
    print(__EVENTVALIDATION)
    print(__VIEWSTATE)
    response = requests.get(url, headers=headers, cookies=cookies, data=data)
    return response

for x in range(1, 11):
    print(x)
    response = request_pag(x, response)

请求一个新页面需要上一次请求的页面的正则匹配的数据,所以才这样写。