我正在尝试使用python的请求库来抓取ASPX网站并从内部的Table获取信息。
How to web scrap an ASPX page that requires authentication中也很好地描述了我遇到的问题,在撰写本文时未作任何答复。
我目前的处理方式是:
将所有参数设置为login_data字典。
headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36"}
with requests.session() as session:
session.headers.update(headers)
response=session.get(login_url)
soup=BeautifulSoup(response.content)
VIEWSTATE = soup.find(id="__VIEWSTATE")['value']
VIEWSTATEGENERATOR = soup.find(id="__VIEWSTATEGENERATOR")['value']
EVENTVALIDATION = soup.find(id="__EVENTVALIDATION")['value']
EVENTTARGET = soup.find(id="__EVENTTARGET")['value']
EVENTARGUEMENT = soup.find(id="__EVENTARGUMENT")['value']
PREVIOUSPAGE = soup.find(id="__PREVIOUSPAGE")['value']
CMSESSIONID = soup.find(id="CMSessionId")['value']
soup.find(id="MasterHeaderPlaceHolder_ctl00_userNameTextbox")['value']
login_data= {
"__VIEWSTATE" : VIEWSTATE,
"txtUserName" : account_name,
"txtPassword" : account_pass,
"__VIEWSTATEGENERATOR" : VIEWSTATEGENERATOR,
"__EVENTVALIDATION": EVENTVALIDATION,
"__EVENTTARGET" : EVENTTARGET,
"__EVENTARGUEMENT" : EVENTARGUEMENT,
"__PREVIOUSPAGE" : PREVIOUSPAGE,
"CMSessionId" : CMSESSIONID,
"MasterHeaderPlaceHolder_ctl00_userNameTextbox" : account_name,
"MasterHeaderPlaceHolder_ctl00_passwordTextbox" : account_pass,
"MasterHeaderPlaceHolder_ctl00_tempPasswordTextbox" : account_pass
}
login_data_encoded = urllib.parse.urlencode(login_data) #*
此外,将login_data字典作为数据传递到对login_url的发布请求。
然后使用同一会话尝试从report_url获取请求。
response_1 = session.post(login_url, data=login_data)
response_2 = session.get(report_url)
问题似乎是未实现登录。因为将get请求重新路由到登录页面。
任何人都可以阐明为什么会这样吗?我猜这是正确的流程,但是如果我做错了什么或者可以改善的话,请告诉我。
不幸的是,我目前仅限于仅使用请求或其他流行的python 3库(因为对此主题的某些答复中建议使用对“浏览器” .exe文件的引用是不可行的。)< / p>