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 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
Python中的字符串操作和编码Unicode详解
Jan 18 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
python实现多层感知器
Jan 18 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
python datetime中strptime用法详解
Aug 29 Python
python计算n的阶乘的方法代码
Oct 25 Python
python Zmail模块简介与使用示例
Dec 19 Python
教你利用python实现企业微信发送消息
May 23 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之第四天
2006/10/09 PHP
PHP实现网上点歌(二)
2006/10/09 PHP
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
详解Node.js开发中的express-session
2017/05/19 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
原生js实现购物车功能
2020/09/23 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
Python中的TCP socket写法示例
2018/05/11 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
详解Django配置优化方法
2019/11/18 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
Charles&Keith美国官方网站:新加坡快时尚鞋类和配饰零售商
2019/11/27 全球购物
好的自荐信包括什么内容
2013/11/07 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
公民代理授权委托书
2014/09/24 职场文书
写给老师的感谢信
2015/01/20 职场文书
淮海战役观后感
2015/06/11 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS