龙空技术网

python抓取.NET GridView分页数据实战

拉拉风啦啦 485

前言:

现在咱们对“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显示部分数据