python - 尝试使用 python 登录一个简单的类(class)网站

标签 python python-2.7 web-scraping web-crawler python-requests

我正在尝试使用 python 登录我的类(class)页面之一。

我使用 httpFox 来检测登录页面和发布数据。我不知道为什么,但我不断收到错误消息:

SE 3X03 / CS 4X03 error

SE 3X03 / CS 4X03 error - login.cpp

Internal Error 3

这是我的代码:

import requests

s = requests.session()

login_data = {
    'sno':'xxxxxxx',
    'p1':'xxxxxxx',
    'login':'OK'
}

reqheader = {

    'Host'  :'www.cas.mcmaster.ca',
    'User-Agent' :  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0',
    'Accept'  : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language' : 'en-US,en;q=0.5',
    'Accept-Encoding'  :    'gzip, deflate',
    'Referer'   :   'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/startlogin.cgi',
    'Connection' : 'keep-alive',
    'Content-Type'  :  'application/x-www-form-urlencoded',
    'Content-Length'    :  '33'
}


myurl = 'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi'

r = s.post(myurl, data = login_data, headers = reqheader)



print r.text

任何人都可以给我提示我哪里做错了吗?我很感激。

编辑:

页面源代码中有一行:

<form name="passwd" action="http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi"
method="post">

这是 httpFox 为我检测到的内容,我认为这是实际的登录链接。但是当我尝试在浏览器中访问该网址时,我得到这样的信息:

SE 3X03 / CS 4X03 error - login.cpp

Internal Error 11

这可能是我的代码无法工作的原因吗?

最佳答案

您实际上可以看到在幕后使用的 login.cpp ,它是 available online

有趣的部分是内部错误3发生的地方:

  p=line;
  if (strncmp(p,"sno=",4)==0) {
    p += 4; // eat 'sno='
    if (*p=='&') { // no sno value
      p++; // eat &
    }else{
      q=p+1;
      while(! (*q=='&' || *q=='\0')) q++;
      if (*q=='\0') error("Internal error 2");
      *q='\0';
      if (strlen(p)>99) error("Internal error 3");
      translate(snobuf,p);
      p=q+1; // eat '.....&'
    }

如您所见,HTTP 参数是从原始字符串中手动解析的。假设 & 是参数分隔符。

所以你需要做的就是传递它想要传入的内容。并且不需要提供任何特殊的 header 或处理cookie:

import requests

s = requests.Session()
data = 'sno={sno}&p1={p1}&login=+OK+'.format(sno=1234567, p1='Password')

myurl = 'http://www.cas.mcmaster.ca/~franek/courses/se3x03_cs4x03/login/login.cgi'
r = s.post(myurl, data=data)
print r.content

由于 1234567Password 无效,我收到的 HTML 代码中包含错误:

Student number not found, please re-enter

使用有效的凭据即可进入。

关于python - 尝试使用 python 登录一个简单的类(class)网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681662/

相关文章:

python - django.db.utils.ProgrammingError : syntax error at or near "WITH ORDINALITY" LINE 6:

Python:从多个子进程异步打印标准输出

Python OpenCV 如何在转换后保存图像

python - 如果没有适当的比较器,您可以“读取” leveldb 数据吗?

python - 使用 Beautifulsoup Python 提取没有 HTML 标签的文本

python - 如何使用 `cv2.perspectiveTransform` 在 Python OpenCV 中的一组点上应用单应性?

python - 从 Pandas 数据框列中删除 'seconds' 和 'minutes'

python - SymPy:使用给定变量评估给定表达式

java - 获取span标签的标题

java - 是否有标准化的站点地图格式?