python學習(十八)爬蟲中加入cookie


轉載自:原文鏈接

前幾篇文章介紹了urllib庫基本使用和爬蟲的簡單應用,本文介紹如何通過post信息給網站,保存登陸后cookie,並用於請求有
權限的操作。保存cookie需要用到cookiejar類,可以輸出cookie信息查看下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import http.cookiejar
import urllib.request

#聲明一個CookieJar對象實例來保存cookie
cookie = http.cookiejar.CookieJar()
#HTTPCookieProcessor對象來創建cookie處理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#通過handler來構建opener
opener = urllib.request.build_opner(handler)
#通過opner訪問網址
response = opner.open('http://www.baidu.com')
#訪問cookie中的數據
for item in cookie:
print('Name = '+ item.name)
print('Value = '+ item.value)

 

1 通過http.cookiejar.CookieJar()創建一個cookiejar對象,用來保存上網留下的cookie。
2 為了處理cookie,需要創建cookie處理器,通過urllib.request.HTTPCookieProcessor(cookie)根據cookie
創建cookie處理器。
3 接下來根據cookie處理器,建立opener, urllib.request.build_opener(handler)創建opener
4 通過openr訪問cookie中的數據

可以保存cookie,用於以后訪問有權限的網頁。下面將cookie寫入文件

1
2
3
4
5
6
7
8
9
10
11
12
#定義文件名
filename = 'cookie.txt'
#定義MozillaCookieJar對象保存cookie,並且cookie關聯上filename文件
cookie = http.cookiejar.MozillaCookieJar(filename)
#創建cookie處理器
handler = request.HTTPCookieProcessor(cookie)
#通過handler構建opener
opener = request.build_opener(handler)
#利用opener請求網頁
response = opener.open('http://www.baidu.com')
#保存cookie到文件
cookie.save(ignore_discard = True, ignore_expires = True)

 

1 傳入文件名,調用http.cookiejar.MozillaCookieJar創建cookie,
cookie和文件名綁定了。
2 根據cookie創建處理器, request.HTTPCookieProcessor創建handler
3 根據Cookie處理器創建opener
4 用opener訪問網站,生成cookie
5 cookie.save保存到filename文件中,ignore_discard表示忽略是否過期,
及時被丟棄也保存。ignore_expires表示文件存在則覆蓋寫入。

對於保存好的cookie文件,可以提取並訪問其他網頁。

1
2
3
4
5
6
7
8
9
10
11
12
filename = 'cookie.txt'
#創建MozillaCookieJar對象
cookie = http.cookiejar.MozillaCookieJar()
#從文件中讀取cookie內容到變量
cookie.load(filename, ignore_discard = True, ignore_expires = True)
#生成cookie處理器
handler = request.HTTPCookieProcessor(cookie)
#創建opener
opener = request.build_opener(handler)
#用opener打開網頁
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

1 用MozillaCookieJar創建cookie
2 調用cookie.load加載文件內容到cookie中
3 根據cookie創建HTTPCookieProcessor
4 根據handler創建opener
5 利用opener打開網頁,返回response

下面綜合應用上面的知識,用爬蟲模擬登陸,然后獲取有權限的網頁和信息。
通過瀏覽器審查元素的方式可以查看訪問網站的request和response,用fiddler更方便一些,用fidder監控瀏覽器
數據,然后模擬瀏覽器發送登錄請求。
隨便找一個需要登陸的網站
http://www.lesmao.cc/forum.php
找到登陸按鈕,點擊登陸,查看fiddler監控的數據。
可以在fiddler中看到這個request請求post數據給網站。
1.png
通過webform這一選項看到我們投遞的消息
2.png
有些網頁是需要登陸才能訪問的,如
http://www.lesmao.cc/home.php?mod=space&do=notice&view=system
3.png

下面先模擬登陸,獲取cookie,然后利用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
if __name__ == '__main__':
#登陸地址
login_url = 'http://www.lesmao.cc/member.php?mod=logging&action=login&referer='
#User-Agent信息
user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
#Headers信息
head = {'User-Agnet': user_agent, 'Connection': 'keep-alive'}

#登陸Form_Data信息
Login_Data = {}
Login_Data['formhash'] = '5ea0f6e4'
Login_Data['referer'] = 'http://www.lesmao.cc/./'
Login_Data['loginfield'] = 'username'
Login_Data['username'] = 'second'
Login_Data['password'] = '18301'
Login_Data['loginsubmit'] = 'true'
Login_Data['questionid'] = '0'
Login_Data['answer'] = ''

#使用urlencode方法轉換標准格式
logingpostdata = parse.urlencode(Login_Data).encode('utf-8')
#聲明一個CookieJar對象實例來保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request庫的HTTPCookieProcessor對象來創建cookie處理器,也就CookieHandler
cookie_support = request.HTTPCookieProcessor(cookie)
#通過CookieHandler創建opener
opener = request.build_opener(cookie_support)
#創建Request對象
req1 = request.Request(url=login_url, data=logingpostdata, headers=head)

#面向對象地址
date_url = 'http://www.lesmao.cc/home.php?mod=space&do=notice&view=system'

req2 = request.Request(url=date_url, headers=head)

try:
#使用自己創建的opener的open方法
response1 = opener.open(req1)
#print(response1.read().decode('utf-8'))
print('.................................')
response2 = opener.open(req2)
html = response2.read().decode('utf-8')
#打印查詢結果
print(html)

except error.URLError as e:
if hasattr(e, 'code'):
print("URLError:%d" % e.code)
if hasattr(e, 'reason'):
print("URLError:%s" % e.reason)
except error.HTTPError as e:
if hasattr(e, 'code'):
print("URLError:%d" % e.code)
if hasattr(e, 'reason'):
print("URLError:%s" % e.reason)
except Exception as e:
print('Exception is : ', e)

 

打印出的html信息和登陸后點擊的信息是一致的,所以用cookie登陸並訪問其它權限網頁成功了。
源碼下載地址:
源碼下載
我的公眾號:
gzh.jpg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM