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 相关文章推荐
python实现在windows服务中新建进程的方法
Jun 30 Python
python比较两个列表大小的方法
Jul 11 Python
详解Python的Django框架中的中间件
Jul 24 Python
Python中的id()函数指的什么
Oct 17 Python
Python字符串拼接六种方法介绍
Dec 18 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
通过python连接Linux命令行代码实例
Feb 18 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Python 在函数上添加包装器
Jul 28 Python
利用python汇总统计多张Excel
Sep 22 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
简述数组与指针的区别
2014/01/02 面试题
自荐信要包含哪些内容
2013/11/06 职场文书
初中生自我评价
2014/02/01 职场文书
财务管理制度范本
2015/08/04 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang