我试图通过从网页抓取数据来自动化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
答案 0 :(得分:0)
我弄清楚问题是什么。不幸的是我的选择非常有限,我不能在我公司的笔记本电脑上安装任何东西。如果我在笔记本电脑上拥有管理员权限,我肯定会安装一个嗅探器,看看后台发生了什么。
我手动检查了我的登录页面的来源,然后逐个浏览了POST请求中传递的每个文件。事实证明,有一个隐藏的字段必须通过,我的脚本没有发送它。我将隐藏字段添加到POST请求后,一切顺利。
我建议任何人尝试手动组合POST请求的URL(例如:www.site.com/login.aspx?userid = myid; amp; csid = 233等...)并检查响应一个浏览器。这帮助我找出了从哪里开始调查这个问题。