最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。
登录问题其实就是程序发送请求,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,而cookie就在在http请求和http响应的头信息中,在请求中添加用户信息的cookie即可实现登录。于是乎cookie是消息头的一种很重要的属性。
什么是Cookie?
Cookie的种类
会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。
持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。
Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。
HttpOnly Cookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。
第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。
python模拟登录
首先查看所要爬取网站登录源码:(豆瓣为例)

看了这些之后,我们只用按照登录网址所需信息添加到post中就行。
添加所需的包。
1
2
3
4
5
|
import
requests
import
re
from
bs4
import
BeautifulSoup
import
random
import
urllib, urllib2
|
1
2
3
4
5
6
7
8
9
10
11
|
headers
=
{
'User-Agent'
:'Mozilla
/
5.0
(Windows NT
6.1
; WOW64)\
AppleWebKit
/
537.36
(KHTML, like Gecko) Chrome
/
41.0
.
2272.118
Safari
/
537.36
',}
'form_email'
:
'*@qq.com'
,
'form_password'
:
'password'
,
'login'
:
'登录'
,
}
r
=
requests.post(login_url, data
=
my_post, headers
=
headers)
html
=
r.text
|
1
2
3
4
5
6
7
|
''' download captcha '''
reg
=
r
'<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'
imglist
=
re.findall(reg, html)
urllib.urlretrieve(imglist[
0
],
'%d.jpg'
%
random.randint(
1
,
100
))
captcha
=
raw_input
(
'captcha is: '
)
regid
=
r
'<input type="hidden" name="captcha-id" value="(.*?)"/>'
ids
=
re.findall(regid, html)
|
1
2
3
4
5
|
''' repost '''
my_post[
"captcha-solution"
]
=
captcha
my_post[
"captcha-id"
]
=
ids[
0
]
q
=
requests.post(login_url, data
=
my_post, headers
=
headers)
print
q.url
|
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
''' use bs4 filter douban.com's doumail following'''
print
" login successfully!"
soup
=
BeautifulSoup(q.text)
tag
=
soup.find_all(
'span'
, attrs
=
{
'class'
:
'from'
})
tag2
=
soup.find_all(
'a'
, attrs
=
{
'class'
:
'url'
})
a
=
[]
for
x
in
tag:
a.append(x.get_text())
b
=
[]
for
y
in
tag2:
b.append(y.get_text())
def
split(num):
print
a[num]
+
' '
+
b[num]
print
print
'-'
*
30
, u
'豆瓣豆邮'
,
'-'
*
30
for
x
in
range
(
len
(a)):
split(x)
print
'-'
*
80
|
其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,请多多指教。