前言:
现在咱们对“gridview显示部分数据”大体比较注重,看官们都需要学习一些“gridview显示部分数据”的相关文章。那么小编同时在网上网罗了一些关于“gridview显示部分数据””的相关内容,希望大家能喜欢,同学们一起来学习一下吧!近期,应客户要求,采集一个旧后台管理系统中的数据列表,并将数据详情保存为HTML文件,旧平台架构为.NET 4.0+easyui,数据列为GridView,这个任务的难点是GridView分页数据抓取的问题,因为切换分页的时候,浏览器的URL是无变化的,包括HTTP请求头部、请求参数、请求URL全是一样,采用常规的方式抓取肯定是行不通的(只能采集到第一页的数据),下面看看我是如何获取分页数据。
废话不多说,直接上代码:
我是基于BeautifulSoup+requests+python3.7实现数据的抓取;
首先设置头部信息,用于保证会话和授权:
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E)',
'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
'Content-Type': 'application/x-www-form-urlencoded',
'Accept-Language': 'zh-CN',
'Host': '浏览器F12,根据实际情况填写',
'Cache-Control': 'no-cache',
'Referer': '浏览器F12,根据实际情况填写',
'Cookie': 'ASP.NET_SessionId=浏览器F12,根据实际情况填写'
}
封装网络请求:
def postRequest(url, encoding='utf8', pageno=1):
data = {
'__EVENTTARGET': 'DataPager1',
'__EVENTARGUMENT': f'{pageno}',
'__LASTFOCUS': '',
'GridView1_gesoft_hidScrollOffset': '0,0',
'__VIEWSTATEENCRYPTED': '',
'__VIEWSTATE':'这个必须要填写,否则实现不了分页查询数据',
'__EVENTVALIDATION': '可选,尽量填上',
'HidAddInspectID': '',
'SCAccept$ValueField': '48:105,110,99,108,117,100,101::97,110,100:115,116,114,105,110,103',
'DataPager1_input': f'{pageno}',
'DataPager1$pageSizeList': '10',
'DdlAuthorYear': 'ALL'
}
retryFlag = True
while retryFlag:
retryFlag = False
try:
response = requests.post(url=url, data=data, headers=headers, timeout=10)
response.encoding = encoding
return response
except Exception as e:
print(f'postRequest error({url}) ', e)
retryFlag = True
time.sleep(5)
上述代码中“__VIEWSTATE”参数配置是核心中的核心,这个数据怎么获取呢,我是通过Wireshark抓包工具获取,如下图所示:
为了提高数据采集的稳定性,网络请求增加了超时重试机制。另外特别提醒,请求一定要设置超时时间,否则会导致任务阻塞。
好了,核心部分已经讲完,至于采集到的数据如何用BeautifulSoup进行处理,大家自行在网上查找相关资料,比较简单就不再赘述了。
标签: #gridview显示部分数据