如今在回头去看前面写的东西感受有些杂乱,虽然在写以前已经大概想好要按着怎样的思路去写,可是在真正写的时候发现问题愈来愈多,不懂的地方也愈来愈多,因而就不断的上网去查解决的方法,结果又得到了不少知识,并且也很想将这些知识写进来,因此就成了如今这个样子,之后仍是须要经常提醒本身最初的目的是什么
咱们来回顾一下前面讲的知识,为了实现模拟登陆,咱们先分析了大多数状况下自动登陆的方法,因而咱们知道了 cookies,接着咱们又讨论了怎么使用浏览器工具找到cookies,而且编写代码实现了直接使用 cookies 登陆网站,为了进一步的学习 cookies,咱们又讲解了 cookielib 模块的使用,并且知道了 cookies 有时效性,因而咱们认为不能每一次运行代码前都要先手动登陆,而后获取 cookies 写入再进行登陆,因此咱们分析了浏览器将用户名密码等信息发送出去的过程,讨论了浏览器发送数据的两种方式:POST 和 GET,这时我忽然冒出了一个想法,既然浏览器在 POST 数据以后可以自动登陆,那么我能不能在代码中直接模拟这个过程呢?
因而我设定了这样的一个流程
1. 设置浏览器的 headers, 设置请求等
2. 使用 httpfox 工具获取post data
3. 将post data 写下来并进行编码
4. 携带 headers 和 data 等信息进行网页请求php
这里仍是将获取post data 的过程截图出来,首先是登录界面的网址:http://www.lvye.org/user.php
python
咱们来看看headers和post data
浏览器
你们能够看到,这里在post的后面还有一个url,这个url很重要,真的很重要,它就是的发送数据的真正网址
cookie
好了,这里的post data 也不是不少,我打算把它所有写下去,因而,我写了这样的代码工具
#!/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':'xxxxxxxxxxx', '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()
而后我满心欢喜的等待输出结果......oop
这个页面源码是什么鬼,跟咱们前面直接使用cookies获取到的页面源码不同啊,为何呢?难道咱们的程序出错了吗?post
其实并无,咱们的程序已经达到我咱们想要的效果,它出现了一个我已经登录的提示,就是图中框出来的那部分,但这又是为何呢,并且这些字眼我好像在哪里看到过,为了找出这个缘由,我又去从新登录了一次学习
咱们看到网址仍是原来的网址,可是界面倒是这样的,并且,这里的文字不就是跟源码里面的文字同样吗,那为何会出现这样的状况呢?网站
咱们知道当你输入用户名密码登录一个网站的时候,页面会自动跳转到网站的主页或者其余的网页,总之不会停留在登录的界面,这在浏览器中很容易实现,可是在爬虫代码中就很难实现,由于一发生跳转就是两个界面,也就是两个不一样的url,可是在程序中不可能自动帮你跳转,因此必需要进行两次urlopen()操做,那我就在代码中进行两次urlopen()操做不行吗?来实践看看吧ui
因为 data 是发送给登录界面的数据(前面已经讲解了怎么找post data 里面说有找对应的url的),因此咱们在打开另外一个url时不须要再携带data 信息了,只要在前面那段代码的基础上加上两句话就能够了
response2 = urllib2.urlopen("http://www.lvye.org/userinfo.php?uid=409557") print response2.read()
咱们来看输出结果
这仍是没有返回登录后的页面的源码,这是为何呢?
这篇太长了咱们下一篇讲解吧