Python 登录网站详解及实例


Posted in Python onApril 11, 2017

Python 登录网站详解及实例

对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看。

这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登录了呢?有两种方式:

  1. 在URI 中显式地使用 Session ID;
  2. 利用 Cookie,大概过程是登录一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去。

Python 提供了相当丰富的模块,所以对于这种网络操作只要几句话就可以完成。我以登录 QZZN 论坛为例,事实上下面的程序几乎所有的 PHPWind 类型的论坛都是适用的。

# -*- coding: GB2312 -*-

from urllib import urlencode
import cookielib, urllib2

# cookie
cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

# Login
user_data = {'pwuser': '你的用户名',
       'pwpwd': '你的密码',
       'step':'2'
      }
url_data = urlencode(user_data)
login_r = opener.open("http://bbs.qzzn.com/login.php", url_data)

 一些注释:

  • urllib2 显然是比 urllib 高级一点的模块,里面包括了如何使用 Cookies。
  • 在 urllib2 中,每个客户端可以用一个 opener 来抽象,每个 opener 又可以增加多个 handler 来增强其功能。
  • 在构造 opener 时指定了 HTTPCookieProcessor 做为 handler,因此这个 handler 支持 Cookie。
  • 使用 isntall_opener 后,调用 urlopen 时会使用这个 opener。
  • 如果不需要保存 Cookie,cj 这个参数可以省略。
  • user_data 存放的就是登录所需要的信息,在登录论坛的时候把这个信息传递过去就行了。
  • urlencode 功能是把字典 user_data 编码成"?pwuser=username&pwpwd=password"的形式,这样做是为了使程序易读一些。

最后一个问题是,pwuser、pwpwd 这类的名字是从哪儿来的,这就要分析需要登录的网页了。我们知道,一般的登录界面都是一个表单,节选如下:

<form action="login.php?" method="post" name="login" onSubmit="this.submit.disabled = true;"> 
<input type="hidden" value="" name="forward" /> 
<input type="hidden" value="http://bbs.qzzn.com/index.php" name="jumpurl" /> 
<input type="hidden" value="2" name="step" /> 
... 
<td width="20%" onclick="document.login.pwuser.focus();"><input type="radio" name="lgt" value="0" checked />用户名 <input type="radio" name="lgt" value="1" />UID</td> 
<td><input class="input" type="text" maxLength="20" name="pwuser" size="40" tabindex="1" /> <a href="reg1ster.php" rel="external nofollow" >马上注册</a></td> 
<td>密 码</td> 
<td><input class="input" type="password" maxLength="20" name="pwpwd" size="40" tabindex="2" /> <a href="sendpwd.php" rel="external nofollow" target="_blank">找回密码</a></td> 
... 
</form>

从这里可以看出,我们需要输入的用户名密码对应的就是 pwuser 和 pwpwd,而 step 对应的则是登录(这个是尝试出来的)。

注意到,这个论坛表单采用的是 post 方式,如果是 get 方式则本文的方法就需要变动一下,不能直接 open,而是应该首先 Request,然后再 open。更详细的请看手册...

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python3.2中的字符串函数学习总结
Apr 23 Python
Python中的日期时间处理详解
Nov 17 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
python实现俄罗斯方块游戏
Mar 25 Python
浅谈Pandas:Series和DataFrame间的算术元素
Dec 22 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
Python 文本滚动播放器的实现代码
Apr 25 Python
python实现FTP服务器服务的方法
Apr 11 #Python
python读写json文件的简单实现
Apr 11 #Python
Python实现Mysql数据库连接池实例详解
Apr 11 #Python
详解Python中类的定义与使用
Apr 11 #Python
python获取指定时间差的时间实例详解
Apr 11 #Python
一个基于flask的web应用诞生 组织结构调整(7)
Apr 11 #Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 #Python
You might like
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP基于单例模式实现的mysql类
2016/01/09 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python 数据加密代码
2008/12/24 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
对pandas处理json数据的方法详解
2019/02/08 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
python实现从wind导入数据
2019/12/03 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
可怜妈妈观后感
2015/06/09 职场文书
商业计划书范文
2019/04/24 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL
R9700摩机记
2022/04/05 无线电
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis