如何在Python

时间:2015-06-24 11:27:16

标签: python post

我试图通过从网页抓取数据来自动化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                                                                                                                                                                                                                                                                                              

1 个答案:

答案 0 :(得分:0)

我弄清楚问题是什么。不幸的是我的选择非常有限,我不能在我公司的笔记本电脑上安装任何东西。如果我在笔记本电脑上拥有管理员权限,我肯定会安装一个嗅探器,看看后台发生了什么。

我手动检查了我的登录页面的来源,然后逐个浏览了POST请求中传递的每个文件。事实证明,有一个隐藏的字段必须通过,我的脚本没有发送它。我将隐藏字段添加到POST请求后,一切顺利。

我建议任何人尝试手动组合POST请求的URL(例如:www.site.com/login.aspx?userid = myid; amp; csid = 233等...)并检查响应一个浏览器。这帮助我找出了从哪里开始调查这个问题。