python-49: 爬虫模拟登录源码

上一篇咱们遗留了一个问题,为何post数据后urlopen()两个url仍是没能返回登录以后的网页源码,为了便于分析咱们仍是贴出上一篇的代码php

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = "217小月月坑"

'''
使用post直接登录
'''

import urllib
import urllib2

url = "http://www.lvye.org/user.php"
user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0"
referer = "http://www.lvye.org/user.php"
host = "www.lvye.org"

headers = {'User-Agent':user_agent,
           'Referer':referer,
           'Host':host}
# 这里的用户名和密码要改为大家本身的
data = {'uname':'xxxxxxxxxx',
        'pass':    'xxxxxxxxxx',
        'op':  'login',
        'xoops_redirect':''}
post_data = urllib.urlencode(data)

request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request,post_data)
print response.read()
print "########################################################"
response2 = urllib2.urlopen("http://www.lvye.org/userinfo.php?uid=409557")
print response2.read()

这里详细讲两个问题python

1. 为何一样是 urlopen(),第一个携带data,而第二个却没有携带浏览器

        前面咱们已经说了,data 是post发送的数据,而这个发送的数据是有一个规定的url的,经过httpfox能够找的到,不是随便向哪一个url发送都行的,因此上面那段的第一个url是登录的网址,data数据要被发送到这个网址,而第二个url是网站里面的其余网址,不须要传入任何数据,因此不用写data参数,可是其实你加上来也不会报错,可是仍是不能得出你想要的结果cookie

2. 为何上面的作法会失败oop

        首先咱们能够肯定的是,咱们post的方法是彻底正确的,由于咱们已经从源码中看到了现象,可是为何咱们连续使用两个urlopen()却没有成功呢,由于实际上上面的两个urlopen()只是把两个独立的操做合起来而已,这跟你在两个程序中分别打开这两个url的效果是同样的,无论是哪一个urlopen(),它们都只是将网址打开,发送数据,而后获取返回的页面源码而已,它们并无处理任何数据的能力,好比像cookies,咱们前面也说过,由于urlopen()没有处理cookies和http验证的能力,因此要使用opener,这就是根本的缘由,就像水过鸭背同样,执行完了就完了,并无对数据进行处理,仍是同样白搭,然并卵。post

要解决这个问题只能使用cookies,先post数据到登录的网址,而后使用cookielib获取cookies,再使用这个cookies登录网站中其余的网页。由于登录,获取cookies,使用cookies再次登录这个是在同一个程序中运行的,处理器够快的话,充其量也就是几秒钟的事情,因此cookies的时效性能够不用考虑,好了,结合咱们前面讲解的知识,咱们将代码完成吧网站

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
__author__ = "217小月月坑"

'''
使用post直接登录
'''

import urllib
import urllib2
import cookielib

# 登录界面的url
login_url = "http://www.lvye.org/user.php"
# 用户我的界面的url
user_url = "http://www.lvye.org/userinfo.php?uid=409557"

# 设置浏览器的headers信息
user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0"
referer = "http://www.lvye.org/user.php"
host = "www.lvye.org"
headers = {'User-Agent':user_agent,
           'Referer':referer,
           'Host':host}

# 设置post 的数据
data = {'uname':'xxxxxxxxx',
        'pass':    'xxxxxxxxxxxxxx',
        'op':  'login',
        'xoops_redirect':''}
# 将数据编码成url查询字符串
post_data = urllib.urlencode(data)
# 初始化一个cookieJar来处理 cookies,CookieJar 这个类是获取cookies并保存
cookieJar = cookielib.CookieJar()
# 给opener加入cookies的处理程序
handler = urllib2.HTTPCookieProcessor(cookieJar)
# 构建一个opener
opener = urllib2.build_opener(handler)
# 构造请求
request = urllib2.Request(login_url,headers=headers)
# 打开登录界面的url,并将data post出去,
login_response = opener.open(request,post_data)
# 自动携带cookies去访问用户界面的url
response = opener.open(user_url)
print response.read()

好了,如今用咱们前面将的判断模拟登录是否成功的方法来验证吧
ui

相关文章
相关标签/搜索