python访问需要登录的网页遇到点问题

林夕_信仰 发布于 2013/09/06 15:19
阅读 2K+
收藏 0
#encoding=utf-8
import urllib2
import urllib
import cookielib

def scuGradeBrower(url,user,password):
    login_page = "http://www.renren.com/PLogin.do"                   #行1,此行需更改
    
    try:
        cj = cookielib.CookieJar()
        opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]
        data = urllib.urlencode({"email":user,"password":password})          #行2,此行需更改
        opener.open(login_page,data)
        op=opener.open(url)
        data= op.read()
        return data
    except Exception,e:
        print str(e)

f = open('renrenwang.html', 'w')
content = scuGradeBrower("http://www.renren.com/home","xxx","xxx")         #行3,此行需更改
f.write(content)
f.close()

上面这段程序用来抓登陆后的人人网,成功。

然后我将#行1、#行3分别更改为:

login_page = "http://202.115.47.141/"

content = scuGradeBrower("http://202.115.47.141/loginAction.do","xxx","xxx")

用来抓学校学生系统登陆后的页面,但是抓取失败,提示证件号不存在,后来经人指点,说#行2可能有问题,查看学生登陆系统的源代码后发现:

<input type="text" name="zjh" value="" class="input01" title="帐号" alt="notnull"></td>
<input type="password" name="mm" value="" class="input01" title="密码" alt="notnull"></td>
于是,把#行2改为:

data = urllib.urlencode({"zjh":user,"mm":password})

但是仍然失败,提示证件号不存在,输入的账户和密码确认一定是正确的,程序用来抓人人网成功,为什么用来抓学生系统就出问题了呢?希望帮忙解决一下,真是万分感谢啊!!

加载中
0
sToa
sToa
#encoding=utf-8
import urllib2
import urllib
import cookielib

def scuGradeBrower(url,user,password):
    login_page = "http://202.115.47.141/loginAction.do"

    try:
        cj = cookielib.CookieJar()
        opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
        opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')]
        data = urllib.urlencode({"zjh":user,"mm":password})
        opener.open(url)
        op=opener.open(login_page,data)
        data= op.read()
        return data
    except Exception,e:
        print str(e)

f = open('renrenwang.html', 'w')
content = scuGradeBrower("http://202.115.47.141/","xx","xx")
f.write(content)
print content.decode('gbk')
f.close()
0
林夕_信仰
林夕_信仰
哭,一直在等啊,求高手帮帮忙!!
0
sToa
sToa

学生系统中除了账号,密码外是不是还有个参数是证件号呢?
1.可以用chrome自带的"审查元素"功能中的Network监视网页内部http请求信息,确认参数是否正确
2.还不能解决的话,建议你抓包工具,如Fiddler2,HTTP Analyzer,抓取浏览器和你程序的登录数据包,找出两者不一样的地方,那就是问题所在

林夕_信仰
林夕_信仰
只有账户和密码要填,抓包工具不太懂额,新手
0
sToa
sToa
你给我个学生系统的测试账号,我试下
林夕_信仰
林夕_信仰
回复 @prehisle : 已留言~
林夕_信仰
林夕_信仰
回复 @prehisle : 恩,好
sToa
sToa
回复 @林夕_信仰 : 未收到,你给发留言吧
林夕_信仰
林夕_信仰
回复 @prehisle : 已发~
林夕_信仰
林夕_信仰
你能给个邮箱吗?我发给你,真是谢谢了!!
0
sToa
sToa
        opener.open(url)  #我只是把这行与下行换位了
        op=opener.open(login_page,data)
sToa
sToa
回复 @林夕_信仰 : 是的,成功了,你复制上一楼的代码,将xx改成正确的账号密码,运行后生成的renrenwang.html就是登录后的页面文件
林夕_信仰
林夕_信仰
你成功了吗?虽然可以输出些东西,但是生成的HTML文件只显示显:未找到此网页。。。。(其他什么都没有)但是人人网可以完美的生成登陆后的HTML文件
0
crifan
crifan

1.我之前已经实现人人网的登陆了

详见:

BlogsToWordpress

中的:

BlogRenren.py

2。关于网络抓取和模拟登陆:

(1)先去用工具分析网页登陆的逻辑

(2)再写代码去模拟对应的逻辑

3.你这里,大概感觉:

最可能的是:没有模拟对应的逻辑,没有获得对应的cookie

其次是:可能漏了哪些参数或者参数值赋值不对

总之:

参见2,先搞懂逻辑再写代码,否则都白搭。

crifan
crifan
回复 @林夕_信仰 : 恩。那就好。 我还写了其他很多教程的。感兴趣的话,再贴出来给你看,呵呵。
林夕_信仰
林夕_信仰
恩恩,我在你的blog里学了好多东西,终于搞懂了逻辑成功了!
0
sToa
sToa
#encoding:utf-8

import urllib
import urllib2
import cookielib
import bs4
from bs4 import BeautifulSoup

def str_change(str):
    return str.strip()

def point_list(soup):
    p=[]
    courses = soup.findAll('tr', {'class': 'odd'})
    length = len(courses)
    for t in xrange(length):
        course=[]
        TR = courses[t].contents
        course.append(str_change(TR[5].contents[0]))
        course.append(str_change(TR[9].contents[0]))
        course.append(str_change(TR[11].contents[0]))
        course.append(str_change(TR[13].contents[1].contents[0]))
        p.append(course)
    return p


def scoreScanner(url,username, password):
    login_page = 'http://202.115.47.141/loginAction.do'

    cj = cookielib.CookieJar();
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    data = urllib.urlencode({"zjh":username,"mm":password})

    request = urllib2.Request(login_page, data)
    request.add_header('User-Agent', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0')

    response = opener.open(request)

    next = opener.open(url)
    doc = next.read()
    soup = BeautifulSoup(''.join(doc), from_encoding='GBK')

    soup.findAll('table', {'class': 'titleTop2'})[1].extract()

    final = point_list(soup)
    f = open('point.py', 'w')
    temp = u'#encoding:utf-8\n\ncourse = %s\n' % final
    temp = temp + "print course[0][0]"
    f.write(temp.encode('utf-8'))
    f.close
最后一行自己加上,运行生成的point.py结果为"微积分(Ⅰ)-1",你还需要恶补下基础,str与list,_repr_之间的关系,还有编码相关的知识点参考 http://www.oschina.net/question/997162_124116
林夕_信仰
林夕_信仰
谢谢!!又学到不少东西,一定加强学习!!
0
秦敛
秦敛
我用php写也遇到这个问题了,但是看不懂python,能告诉我到底是怎么回事吗,是post参数不全还是提交url不对。原谅我挖坟
秦敛
秦敛
回复 @林夕_信仰 : 没事,是我的话我也记不住
林夕_信仰
林夕_信仰
额,2年了。。。不好意思,真的记不得了
返回顶部
顶部