python3爬蟲 - cookie登錄實戰


http://blog.csdn.net/pipisorry/article/details/47948065

實戰1:使用cookie登錄哈工大ACM站點

獲取站點登錄地址

http://acm.hit.edu.cn/hoj/system/login

查看要傳送的post數據

user和password

Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = 'pi'
__email__ = 'pipisorry@126.com'

"""
import urllib.request, urllib.parse, urllib.error
import http.cookiejar

LOGIN_URL = 'http://acm.hit.edu.cn/hoj/system/login'
values = {'user': '******', 'password': '******'} # , 'submit' : 'Login'
postdata = urllib.parse.urlencode(values).encode()
user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'
headers = {'User-Agent': user_agent, 'Connection': 'keep-alive'}

cookie_filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)

request = urllib.request.Request(LOGIN_URL, postdata, headers)
try:
    response = opener.open(request)
    page = response.read().decode()
    # print(page)
except urllib.error.URLError as e:
    print(e.code, ':', e.reason)

cookie.save(ignore_discard=True, ignore_expires=True)  # 保存cookie到cookie.txt中
print(cookie)
for item in cookie:
    print('Name = ' + item.name)
    print('Value = ' + item.value)

get_url = 'http://acm.hit.edu.cn/hoj/problem/solution/?problem=1'  # 利用cookie請求訪問還有一個網址
get_request = urllib.request.Request(get_url, headers=headers)
get_response = opener.open(get_request)
print(get_response.read().decode())
# print('You have not solved this problem' in get_response.read().decode())

Note:

1. 直接open http://acm.hit.edu.cn/hoj/problem/solution/?

problem=1頁面不知道去哪了,根本不是直接用瀏覽器登錄后的界面!

用cookie登錄就能夠正常訪問。html代碼中會有一句話you have not solved this problem。由於我沒做這道題。

2. 原理:創建一個帶有cookie的opener,在訪問登錄的URL時,將登錄后的cookie保存下來,然后利用這個cookie來訪問其它網址。查看登錄之后才干看到的信息。[python 3.3.2 爬蟲記錄]

反復使用cookie登錄

上面代碼中我們保存cookie到文件里了,以下我們能夠直接從文件導入cookie進行登錄,不用再構建包括username和password的postdata了

import urllib.request, urllib.parse, urllib.error
import http.cookiejar

cookie_filename = 'cookie.txt'
cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
print(cookie)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)

get_url = 'http://acm.hit.edu.cn/hoj/problem/solution/?problem=1'  # 利用cookie請求訪問還有一個網址
get_request = urllib.request.Request(get_url)
get_response = opener.open(get_request)
print(get_response.read().decode())

皮皮Blog



實戰2:使用cookie登錄伯樂在線

獲取站點登錄地址

1. chrome瀏覽器中按F12審查元素 > Network > Headers > General > Request URL: http://www.jobbole.com/login/?redirect=http://www.jobbole.com/

然而這個並非其真實站點登錄網址^-^


2. 也能夠下載軟件Fiddler for .NET2查看相關信息。執行python程序訪問和直接在瀏覽器中刷新都能夠在fiddler中找到相關信息。
Note: fiddler事實上是抓包用的,是獨立的工具。類似這樣的前端登錄動作,也能夠用casperjs。還能夠用HttpWatch瀏覽器嵌入工具。

查看200所在的條目(200:請求成功      處理方式:獲得響應的內容,進行處理

以下是登錄后看到的request中有webforms的信息相應的網址是也就是其真實站點登錄網址http://www.jobbole.com/wp-admin/admin-ajax.php


(嚇死爺了。第一次上傳居然忘了把password遮住!

)

查看要傳送的post數據

1. 上面使用fiddler看到的webforms就是登錄要用的post數據要包括的(當中redict_url是能夠不加上去的)

2. 或者使用瀏覽器Elements > html文檔中所要提交的數據有name和password。然而這個並非真實的post數據^-^


查看headers信息

假設不自己加入headers信息中的User-Agent。python代碼登錄時會默認使用User-Agent: Python-urllib/3.4

我們在chrome瀏覽器中按F12審查元素 > Network > Headers中能夠看到User-Agent應該設置為:'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'

一般要加入的headers信息有:

'Host': '', 'Accept': '', 'User-Agent': '', 'Accept-Language': '', Accept-Encoding

登錄后查看request headers

發現cookie發生了變化,加上了username***和password*************

Cookie:
wordpress_test_cookie=WP+Cookie+check
Cookie:
wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_0efdf49af511fd88681529ef8c2e5fbf=****%7C1440690138%*********************

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'pi'
__mtime__ = '8/23/2015-023'
__email__ = 'pipisorry@126.com'
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
              ┏┓      ┏┓
            ┏┛┻━━━┛┻┓
            ┃      ☃      ┃
            ┃  ┳┛  ┗┳  ┃
            ┃      ┻      ┃
            ┗━┓      ┏━┛
                ┃      ┗━━━┓
                ┃  神獸保佑    ┣┓
                ┃ 永無BUG。   ┏┛
                ┗┓┓┏━┳┓┏┛
                  ┃┫┫  ┃┫┫
                  ┗┻┛  ┗┻┛
"""
import urllib.request, urllib.parse, urllib.error
import http.cookiejar

LOGIN_URL = 'http://www.jobbole.com/wp-admin/admin-ajax.php'
get_url = 'http://www.jobbole.com/'  # 利用cookie請求訪問還有一個網址

values = {'action': 'user_login', 'user_login': '*****', 'user_pass': '******'}
postdata = urllib.parse.urlencode(values).encode()
user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'
headers = {'User-Agent': user_agent}

cookie_filename = 'cookie_jar.txt'
cookie_jar = http.cookiejar.MozillaCookieJar(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
opener = urllib.request.build_opener(handler)

request = urllib.request.Request(LOGIN_URL, postdata, headers)
try:
    response = opener.open(request)
    # print(response.read().decode())
except urllib.error.URLError as e:
    print(e.code, ':', e.reason)

cookie_jar.save(ignore_discard=True, ignore_expires=True)  # 保存cookie到cookie.txt中
for item in cookie_jar:
    print('Name = ' + item.name)
    print('Value = ' + item.value)

get_request = urllib.request.Request(get_url, headers=headers)
get_response = opener.open(get_request)
print('個人主頁' in get_response.read().decode())
Note:
1. cookie登錄不成功則會輸出:
Name = wordpress_test_cookie
Value = WP+Cookie+check
這個就說明之前根本沒有登錄成功,主要是真實登錄地址不正確!

2. cookie登錄成功時會輸出:

Name = wordpress_0efdf49af511fd88681529ef8c2e5fbf

Value = *****%***%*******************(value中會包括賬戶和password)

而且jobbole_response.read()輸出中存在“個人主頁”“退出登錄”字樣。就說明登錄成功了。否則僅僅會有“登錄”“注冊”之類的字符串。

使用剛剛保存的cook_jar.txt文件登錄參見[python爬蟲 - Urllib庫及cookie的使用 - 從文件里獲取Cookie並訪問]

皮皮Blog



實戰3:使用cookie登錄知乎

眼下知乎採用動態驗證碼破解還沒驗證。這樣post里面還須要captcha的參數。待定。。。

Note:這個_xsrf事實上能夠不submit,它已經作為cookie寫進去了。能夠看看登入www.zhihu.com的返回的header。

皮皮Blog



實戰4:使用cookie登錄本科站點爬取成績信息

注意這個站點是https的站點。只是和上面的cookie登錄的http站點一樣登錄。登錄的是電子科大門戶(由於小編就是UESTC的嘛)

獲取本科站點登錄地址

1. chrome瀏覽器中按F12審查元素 > Network > Headers > General > Request URL:https://uis.uestc.edu.cn/amserver/UI/Login

能夠看到其真實站點登錄網址為https://uis.uestc.edu.cn/amserver/UI/Login

2. 當然也能夠用fiddler抓取https的請求,只是要配置一下:Tools > fiddler options > https > capture...和decrypt都打√ > 然后依據提示安裝一證書yes就能夠了

查看要傳送的post數據

打開fiddler后。瀏覽器中登錄門戶站點,在fidddles中看到相應的webforms實際提交的數據。只是也僅僅要IDToken1', 'IDToken2這兩個數據。


代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__author__ = 'pi'
__email__ = 'pipisorry@126.com'
"""
import urllib.request
import urllib.parse
import urllib.error
import http.cookiejar

LOGIN_URL = r'https://uis.uestc.edu.cn/amserver/UI/Login'  # 登錄教務系統的URL
get_url = 'http://eams.uestc.edu.cn/eams/teach/grade/course/person.action'  # 利用cookie請求訪問還有一個網址

values = {'IDToken1': '201106******', 'IDToken2': '***********'}
postdata = urllib.parse.urlencode(values).encode()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}

cookie_filename = 'cookie_jar.txt'
cookie_jar = http.cookiejar.MozillaCookieJar(cookie_filename)
handler = urllib.request.HTTPCookieProcessor(cookie_jar)
opener = urllib.request.build_opener(handler)

request = urllib.request.Request(LOGIN_URL, postdata, headers)
try:
    response = opener.open(request)
    # print(response.read().decode())
except urllib.error.URLError as e:
    print(e.code, ':', e.reason)

cookie_jar.save(ignore_discard=True, ignore_expires=True)  # 保存cookie到cookie.txt中
for item in cookie_jar:
    print('Name = ' + item.name)
    print('Value = ' + item.value)

get_request = urllib.request.Request(get_url, headers=headers)
get_response = opener.open(get_request)
print(get_response.read().decode())

小編已gui,里面什么也沒了。顯示沒有信息!

樓主畢業了的T^T

[pyQuery語法來操作解析 HTML 文檔解析教學網頁]

[ 計算大學本學期績點]

from:http://blog.csdn.net/pipisorry/article/details/47948065

ref:



免責聲明!

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



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