我正在尝试通过从网页中抓取数据来使用Python自动生成报告。该站点使用我需要通过的身份验证。
我使用以下代码登录并尝试下载报告页面,但看来我做错了。身份验证通过HTTP状态代码200,但身份验证之后,该站点立即显示“在处理请求时遇到错误。请查看日志以获取更多详细信息。” 我猜它是指服务器日志,但我不是服务器的所有者,所以我无法检查。
我认为我在登录期间未在POST请求中传递任何内容,因此我收到了此消息。
有没有可以用来跟踪GET / POST流量和需求的工具?我要抓取的网站相当老,是用.NET编写的,并且与Chrome不兼容,因此我无法使用Chrome的开发者工具。
这是我的代码:
import requests
USERNAME = 'myuser'
PASSWORD = 'mypw'
DOMAIN = 'domain comes here'
LOGINURL = 'https://reportsite.com/login'
DATAURL = 'https://reportsite.com/data'
session = requests.session()
req_headers = {
'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding' : 'gzip, deflate',
'Accept-Language' : 'en-US,en;q=0.8',
'Cache-Control' : 'max-age=0',
'Connection' : 'keep-alive',
'Content-Length' : '573',
'Content-Type' : 'application/x-www-form-urlencoded',
'Cookie' : 'ASP.NET_SessionId=u03xo1ypcphzfo523c0lc5ok',
'Host' : 'myhost.net',
'Origin' : 'https://myhost.net',
'Referer' : 'https://myhost.net/WAS/Login.aspx?ReturnUrl=%2fWAS%2fAWEMain.aspx%3flog%3dsaved%26xcapp%3dsplash%26xcsid%3dVISTA&log=saved&xcapp=splash&xcsid=VISTA',
'User-agent': 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)'
}
formdata = {
'__VIEWSTATE' : '/wEPDwUJNzM1NjMxNzAxD2QWAgIBD2QWAgIDDxBkDxYGZgIBAgICAwIEAgUWBhAFBEFQQUMFBEFQQUNnEAUDQVVTBQNBVVNnEAUDRVVSBQNFVVJnEAUDSlBOBQNKUE5nEAUDTEFDBQNMQUNnEAUDTkFNBQNOQU1nZGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDEltYWdlQnV0dG9uMQ7nE6wwQ2IuIJZCRML2VTku00DrmD2fT7YsZ+JtwEKT',
'__VIEWSTATEGENERATOR' : '999CB518',
'__EVENTVALIDATION' :' /wEWCgLvhYTaCwLL/4HeAgLSwpnTCALSxeCRDwKmhfK5BQKoxMzXBAKJv+mgAQLYyZC+BwLdu76IAgK5oPGLAXlSoU7X+UsNQS7lILVvRCWX/xKRtPK1u2cI/XJCVBMI',
'Userid': USERNAME,
'ImageButton1.x' :28,
'ImageButton1.y' :7,
'Password': PASSWORD,
'Domain' : DOMAIN,
'WANT_NEW_USER' : ''
}
# Authenticate
r = session.post(LOGINURL, data=formdata, headers=req_headers, allow_redirects=False)
print "___________LOGIN____________"
print r.headers
print r.status_code
print r.text
# Read data
r2 = session.get(DATAURL)
print "___________DATA____________"
print r2.headers
print r2.status_code
print r2.text
我找出了问题所在。不幸的是,我的选择非常有限,我无法在公司的笔记本电脑上安装任何东西。如果我拥有笔记本电脑的管理员权限,那么我肯定会安装一个嗅探器,以查看后台发生了什么。
我手动检查了登录页面的来源,并逐个逐一处理了在POST请求中传递的内容。原来,存在一个必须通过的隐藏字段,而我的脚本没有发送它。在将隐藏字段添加到POST请求后,一切进行得很顺利。
我建议任何人尝试手动将POST请求的URL放在一起(例如:www.site.com/login.aspx?userid=myid&csid=233等),然后在浏览器中检查响应。这有助于我弄清楚从哪里开始调查此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句