对于社交网络的爬虫,有一个很大的问题就是处理登陆。对于认证模块,有很多方法,获取cookie伪装成为浏览器。再或者调用第三方网站API,进行 Oauth认证。
下面针对 renren 网,通过使用 cookie 方式登录。
python 有一个标准模块 cookielib。里面有一个 CookieJar类,可以生成一个获取远程cookie的对象实例。 用法如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import
cookielib
# 获取一个cookie对象
cookie
=
cookielib.CookieJar()
# 构建cookie处理器
cookie_Hp
=
urllib2.HTTPCookieProcessor(cookie)
# 装在 cookie
opener
=
urllib2.build_opener(cookie_Hp)
# 发送请求
response
=
opener.
open
(
'http://www.baidu.com'
)
# 查看请求之后的 cookie
for
i
in
cookie:
print
'name'
, i.name
print
'value'
, i.value
|
上面代码就是 cookie的基本用法。下面给出登录人人网的基本代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# -*- coding: utf-8 -*-
import
urllib2, urllib, cookielib, re
class
LoginRenren(
object
):
"""登陆人人构造器"""
def
__init__(
self
, email, password):
self
.email
=
email
self
.password
=
password
self
.domain
=
'renren.com'
self
.logined_url
=
''
self
.logined_url_re
=
r
'http://www.renren.com/\d{9}'
self
.islogin
=
False
try
:
# 获取构建cookie
cookie
=
cookielib.CookieJar()
cookieProc
=
urllib2.HTTPCookieProcessor(cookie)
except
:
raise
else
:
#装载cookies
opener
=
urllib2.build_opener(cookieProc)
urllib2.install_opener(opener)
def
login(
self
):
"""登陆方法"""
print
'login...'
# 登陆地址
url
=
'http://www.renren.com/PLogin.do'
# post数据
postdata
=
{
'email'
:
self
.email,
'password'
:
self
.password,
'domain'
:
self
.domain
}
# 编码登陆的post数据
data
=
urllib.urlencode(postdata)
# 构造请求
req
=
urllib2.Request(
url,
data
)
# 发送请求,获取响应
# response = opener.open(req)
response
=
urllib2.urlopen(req)
# 登陆后的url
self
.logined_url
=
response.geturl()
# 判断登陆是否成功
self
.__isLogin()
if
self
.islogin
=
=
True
:
print
u
'登陆成功 !'
self
.__getStatus()
else
:
print
u
'登录失败,请重试 !'
def
__isLogin(
self
):
"""判断登陆是否成功"""
if
re.search(
self
.logined_url_re,
self
.logined_url) !
=
None
:
self
.islogin
=
True
def
__getStatus(
self
):
pass
if
__name__
=
=
'__main__'
:
# 请输入您的用户名
EMAIL
=
raw_input
(u
'email:'
)
# 请输入您的密码
PASSWORD
=
raw_input
(u
'password:'
)
lr
=
LoginRenren(EMAIL, PASSWORD)
lr.login()
|
这个方法还有一个问题,就是有时候会会出现验证码问题。我采用的 hack 手段就是用浏览器登录一次。然后多运行几次这个程序,就能登陆,至于登陆之后做点什么,就是 __getStatus 方法处理的事情了。