1、__doPostBack(eventTarget, eventArgument)方法:
# 参数
evenntTarget # 要调用服务器控件生成的name熟悉
'''
参数:ctl00$ContentPlaceHolder1$AspNetPager1,可以拆分如下,
id为 ctl00的父控件
id为 ContentPlaceHolder1的子控件
id为 AspNetPager1 的子控件
即:父控件$子控件 或者 父控件:子控件
'''
eventArgument # 调用事件的参数
# 最后这两个参数会分别传给隐藏参数__EVENTTARGET、__EVENTARGUMENT
'__EVENTARGUMENT': '3',
'__EVENTTARGET': ctl00$ContentPlaceHolder1$AspNetPager1
{
'__VIEWSTATE': 页面状态信息
'__EVENTVALIDATION': 一个数字签名,用来验证事件是否合法
}
获取__VIEWSTATE和__EVENTVALIDATION这两个隐藏参数的值,可以通过先发起请求一个get请求获取,放入data中,再发起一个post。
# 案例--中国煤炭科技网>科技专家页面
import time
import requests
from bs4 import BeautifulSoup
def get_expert_list(url, page):
'''
url:链接
page:爬取页数
'''
expert_list = []
url = url
html = requests.get(url).content
bf = BeautifulSoup(html, 'html.parser')
VIEWSTATE = bf.find('input', {'id': '__VIEWSTATE'}).attrs['value']
EVENTVALIDATION = bf.find('input', {'id': '__EVENTVALIDATION'}).attrs['value']
payload = {
'__EVENTARGUMENT': '2',
'__EVENTTARGET': 'ctl00$ContentPlaceHolder1$AspNetPager1',
'__VIEWSTATEGENERATOR': '484839D9',
'__VIEWSTATE': VIEWSTATE,
'__EVENTVALIDATION': EVENTVALIDATION,
'ctl00$App_UserLoginControl1$TextBox1': '',
'ctl00$App_UserLoginControl1$TextBox2': '',
'ctl00$ContentPlaceHolder1$DropDownList1': '0',
'ctl00$ContentPlaceHolder1$TextBox1': '',
'ctl00$ContentPlaceHolder1$AspNetPager1_input': '2',
}
page = int(page)
for i in range(1, page):
payload['__EVENTARGUMENT'] = str(i)
res = requests.post(url, data=payload)
contacthtml = res.content
time.sleep(1)
contactObj = BeautifulSoup(contacthtml, 'html.parser')
li_list = contactObj.select('.zhuanjia--list >li >a')
for a in li_list:
name = a.h3.text
img = a.img.get('src')
e_url = a.get('href')
expert_list.append((name, img, e_url))
return expert_list
get_expert_list('http://www.zgmtkj.com/Expert.aspx?menuTypeId=1', 3)
# 这个脚本可以直接放在scrapy使用
ASP页面隐藏参数__EVENTVALIDATION获取
最新推荐文章于 2022-10-07 15:05:33 发布