python-49: 爬虫模拟登陆源码
2015-12-08 00:00
696 查看
上一篇我们遗留了一个问题,为什么post数据后urlopen()两个url还是没能返回登陆之后的网页源码,为了便于分析我们还是贴出上一篇的代码
这里详细讲两个问题
1. 为什么同样是 urlopen(),第一个携带data,而第二个却没有携带
前面我们已经说了,data 是post发送的数据,而这个发送的数据是有一个规定的url的,通过httpfox可以找的到,不是随便向哪个url发送都行的,所以上面那段的第一个url是登陆的网址,data数据要被发送到这个网址,而第二个url是网站里面的其他网址,不需要传入任何数据,所以不用写data参数,但是其实你加上来也不会报错,但是还是不能得出你想要的结果
2. 为什么上面的做法会失败
首先我们可以确定的是,我们post的方法是完全正确的,因为我们已经从源码中看到了现象,但是为什么我们连续使用两个urlopen()却没有成功呢,因为实际上上面的两个urlopen()只是把两个独立的操作合起来而已,这跟你在两个程序中分别打开这两个url的效果是一样的,不管是哪个urlopen(),它们都只是将网址打开,发送数据,然后获取返回的页面源码而已,它们并没有处理任何数据的能力,比如像cookies,我们前面也说过,因为urlopen()没有处理cookies和http验证的能力,所以要使用opener,这就是根本的原因,就像水过鸭背一样,执行完了就完了,并没有对数据进行处理,还是一样白搭,然并卵。
要解决这个问题只能使用cookies,先post数据到登陆的网址,然后使用cookielib获取cookies,再使用这个cookies登陆网站中其他的网页。因为登陆,获取cookies,使用cookies再次登陆这个是在同一个程序中运行的,处理器够快的话,充其量也就是几秒钟的事情,所以cookies的时效性可以不用考虑,好了,结合我们前面讲解的知识,我们将代码完成吧
好了,现在用我们前面将的判断模拟登陆是否成功的方法来验证吧
#!/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()
这里详细讲两个问题
1. 为什么同样是 urlopen(),第一个携带data,而第二个却没有携带
前面我们已经说了,data 是post发送的数据,而这个发送的数据是有一个规定的url的,通过httpfox可以找的到,不是随便向哪个url发送都行的,所以上面那段的第一个url是登陆的网址,data数据要被发送到这个网址,而第二个url是网站里面的其他网址,不需要传入任何数据,所以不用写data参数,但是其实你加上来也不会报错,但是还是不能得出你想要的结果
2. 为什么上面的做法会失败
首先我们可以确定的是,我们post的方法是完全正确的,因为我们已经从源码中看到了现象,但是为什么我们连续使用两个urlopen()却没有成功呢,因为实际上上面的两个urlopen()只是把两个独立的操作合起来而已,这跟你在两个程序中分别打开这两个url的效果是一样的,不管是哪个urlopen(),它们都只是将网址打开,发送数据,然后获取返回的页面源码而已,它们并没有处理任何数据的能力,比如像cookies,我们前面也说过,因为urlopen()没有处理cookies和http验证的能力,所以要使用opener,这就是根本的原因,就像水过鸭背一样,执行完了就完了,并没有对数据进行处理,还是一样白搭,然并卵。
要解决这个问题只能使用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()
好了,现在用我们前面将的判断模拟登陆是否成功的方法来验证吧
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- 爬虫笔记
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- 12.7 coding-python-mongo相关代码笔记