最近期末測試完結了,正好恰逢周末,就想找點事來做,之前做過爬蟲,遇到了登錄的問題,今天就來整理下。
登錄問題其實就是程序發送請求,服務器返回數據時,發出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
|
其實有很多種方法都可以實現,這只是一種,我也是在探索,希望和我一樣的人可以一起探討,請多多指教。