用python模拟登陆报400错,是什么原因

哈泥湖 发布于 2013/07/25 09:29
阅读 954
收藏 0

各位达人:

我用python模拟登陆,在不加headers的时候报405错,加上headers报400错,能否指点下解决思路,万分感谢!!

用的代码如下:

cj = cookielib.LWPCookieJar()  
cookie_support = urllib2.HTTPCookieProcessor(cj)  
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
urllib2.install_opener(opener)  

postData = {'name': "user",  
                 'password': "psw", 
                 'formhash':formid,} 
postData = urllib.urlencode(postData)

headers = {'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN)',  
           'Referer' : url,
           'Content-Type': 'application/x-www-form-urlencoded',
           'Host': url2,
           'Accept': "text/html, application/xhtml+xml, */*",
           'Connection': 'Keep-Alive',
           'Accept-Encoding': 'gzip, deflate',
           }  

request = urllib2.Request(posturl, postData, headers)  #如果需要headers,则增加
response = urllib2.urlopen(request)  
conn = response.read()  
 

加载中
0
李学明
李学明
400 说明你提交的参数不全
0
crifan
crifan

1.代码不全,没法帮你测试。

2.把你的headers中的Host参数去掉试试。

3.可以参考我的一个,python的完整的,模拟登陆的例子:

Python专题教程:抓取网站,模拟登陆,抓取动态网页

中的:


哈泥湖
代码已在后面贴出,一直是报400错
0
明月照大江
明月照大江

header,每一对heaer的结尾是 \r\n.

所有header结束的时候,也要加\r\n.

所以整个首部字段的结束 是 两个 \r\n

哈泥湖
应该不是header的问题,header是采用标准的字典式提交,我写另外一个模拟登陆也是这种格式,可以跑通
0
哈泥湖
#! /usr/bin/env python
#coding=utf-8
import sys, HTMLParser, urlparse  
import urllib , urllib2  
import cookielib  
import string, os, Image, re
from bs4 import BeautifulSoup as bs

#登录的主页面  
loginurl = 'http://www.fy114.com.cn/yygh/login.aspx'  
posturl = 'http://www.fy114.com.cn/yygh/index.htm'
cj = cookielib.LWPCookieJar()  
cookie_support = urllib2.HTTPCookieProcessor(cj)  
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
urllib2.install_opener(opener) 

# 准备验证码、基本信息  
try:
    soup   = bs(urllib.urlopen(loginurl).read(),from_encoding='utf-8')
    codeurl = 'http://www.fy114.com.cn/yygh/'+soup.find("img",{"id":"ImageCheck"})['src']
    codePicture = 'E:\\pythonworkspace\\sciplot\\picture\\login\\code.jpg'
    f = open(codePicture, "wb")
    f.write(urllib.urlopen(codeurl).read())
    f.close()
except:
    print '错误!无法解析网页'


# 识别验证码

img=binary(codePicture)
checkCode=recognize("E:\\pythonworkspace\\sciplot\\picture\\4-charbase\\finnal\\",img)

# 构建postData
viewstate = soup.find("input",{"id":"__VIEWSTATE"})['value']
eventvalidation = soup.findAll("input")[1]['value']
hfid = soup.find("input",{"id":"HFID"})['value']

# 此处测试仅需提交两项
headers = { 
            'Host': 'http://www.fy114.com.cn',
            'Referer': 'http://www.fy114.com.cn/yygh/login.aspx',
           }  
#构造Post数据,他也是从抓大的包里分析得出的。  
postData = {
            '__LASTFOCUS':"",
            '__EVENTTARGET':"",
            '__EVENTARGUMENT':"",
            '__VIEWSTATE': viewstate,  
            '__EVENTVALIDATION': eventvalidation, 
            'UserID': 'yourid',
            'UserPSW': 'password',
            'CheckCode': checkCode,
            'HFID':hfid,
            'ImageButton1.x': '46',
            'ImageButton1.y': '23',
            }  

 
postData = urllib.urlencode(postData)  
request  = urllib2.Request(loginurl, postData, headers)
response = urllib2.urlopen(request)
request2 = urllib2.Request(posturl, postData, headers)
response2 = urllib2.urlopen(request2)  
conn = response2.read()  
print conn
这个是源代码
0
crifan
crifan

1.虽然给出代码,但是也是没法判断错误原因的。

因为不知道你此处的,本身的你的那个网站的内部的登陆逻辑。

2.只有:

知道了网站登陆逻辑

才能用代码,完整的模拟出来,才可能登陆成功。

3.反过来说:

如果登陆模拟出错,那可能是,某个细节,比如某些cookie,某些参数,等等不正确,导致服务器不识别,所以不能登陆,也是正常的。

4.想要解决:

唯一办法是:

先拿到用户名和密码

去用工具分析网站的登陆逻辑

然后写测试代码

然后要经过调试

幸运的话,很快就搞定

不幸运的话,会花很长时间才能调试出来的。


基于目前的条件:

一是没有用户名和密码

二是暂时没那么多时间去调试

所以,还是靠你自己一点点调试吧。

返回顶部
顶部