对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看。
这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登录了呢?有两种方式:
- 在URI 中显式地使用 Session ID;
- 利用 Cookie,大概过程是登录一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去。
Python 提供了相当丰富的模块,所以对于这种网络操作只要几句话就可以完成。我以登录 QZZN 论坛为例,事实上下面的程序几乎所有的 PHPWind 类型的论坛都是适用的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# -*- 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 这类的名字是从哪儿来的,这就要分析需要登录的网页了。我们知道,一般的登录界面都是一个表单,节选如下:
1
2
3
4
5
6
7
8
9
10
11
|
<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。更详细的请看手册...
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://www.cnblogs.com/huangcong/archive/2011/08/30/2160083.html