网站链接:aHR0cHM6Ly9iaWRkaW5nLnNpbm9wZWMuY29tL3RwZnJvbnQveHhnZy8wMDQwMDEv
目标:抓取十页数据
1.抓包
先是请求了url
,然后请求接口,获取到列表数据
看到cookie
的几个参数比较可疑
请求首页的表单数据只有一个
那我请求其他页呢?
这几个数比较可疑
__EVENTARGUMENT
: 表示要请求的页数
MoreinfoListsearch1$Pager_input
: 表示跳转之前的页数
__VIEWSTATE
: 应该是base64
加密
不得不说,这个网站是真慢
2.分析js
可以看到index
页面只是一个header与footer
,没有数据
观察请求数据的url
后,大胆猜测在/tpfront/CommonPages
下
大致看一下源码,里面有列表页的数据,和提交数据的代码,用的同步方式
打上断点
在按下下一页的时候会立即在断点处断下来,
升级了新版chrome
对逆向很友好。爱了爱了
单步步过309行后发出请求
忽略断点,执行,再按新的一页,断在原来位置,在控制台输入
这些参数,然后发现有输出
放开断点对比一下抓包的数据和这个一样吗
发现一样。
在页面中搜索这个值,
发现是写死的,页面应该是服务器返回的
然后看请求头
多抓几次包,发现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)
请求一个新页面需要上一次请求的页面的正则匹配的数据,所以才这样写。