Python類比登入的多種方法

來源:互聯網
上載者:User
這篇文章主要介紹了Python類比登入的多種方法,大概給大家提供了四種方法,每種方法給大家介紹的都很詳細,感興趣的朋友一起看看吧

本文

方法一:直接使用已知的cookie訪問

特點:

  簡單,但需要先在瀏覽器登入

原理:

  簡單地說,cookie儲存在發起請求的用戶端中,伺服器利用cookie來區分不同的用戶端。因為http是一種無狀態的串連,當伺服器一下子收到好幾個請求時,是無法判斷出哪些請求是同一個用戶端發起的。而“訪問登入後才能看到的頁面”這一行為,恰恰需要用戶端向伺服器證明:“我是剛才登入過的那個用戶端”。於是就需要cookie來標識用戶端的身份,以儲存它的資訊(如登入狀態)。

  當然,這也意味著,只要得到了別的用戶端的cookie,我們就可以假冒成它來和伺服器對話。這給我們的程式帶來了可乘之機。

  我們先用瀏覽器登入,然後使用開發人員工具查看cookie。接著在程式中攜帶該cookie向網站發送請求,就能讓你的程式假扮成剛才登入的那個瀏覽器,得到只有登入後才能看到的頁面。

具體步驟:

1.用瀏覽器登入,擷取瀏覽器裡的cookie字串

  先使用瀏覽器登入。再開啟開發人員工具,轉到network選項卡。在左邊的Name一欄找到當前的網址,選擇右邊的Headers選項卡,查看Request Headers,這裡包含了該網站頒發給瀏覽器的cookie。對,就是後面的字串。把它複製下來,一會兒代碼裡要用到。

  注意,最好是在運行你的程式前再登入。如果太早登入,或是把瀏覽器關了,很可能複製的那個cookie就到期無效了。

2.寫代碼

  urllib庫的版本:

import sysimport iofrom urllib import requestsys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的預設編碼#登入後才能訪問的網站url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#瀏覽器登入後得到的cookie,也就是剛才複製的字串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#登入後才能訪問的網頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'req = request.Request(url)#設定cookiereq.add_header('cookie', raw_cookies)#佈建要求頭req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')resp = request.urlopen(req)print(resp.read().decode('utf-8'))

  requests庫的版本:

import requestsimport sysimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的預設編碼#登入後才能訪問的網頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#瀏覽器登入後得到的cookie,也就是剛才複製的字串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#把cookie字串處理成字典,以便接下來使用cookies = {}for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = value

方法二:類比登入後再攜帶得到的cookie訪問

原理:

  我們先在程式中向網站發出登入請求,也就是提交包含登入資訊的表單(使用者名稱、密碼等)。從響應中得到cookie,今後在訪問其他頁面時也帶上這個cookie,就能得到只有登入後才能看到的頁面。

具體步驟:

1.找出表單提交到的頁面

  還是要利用瀏覽器的開發人員工具。轉到network選項卡,並勾選Preserve Log(重要!)。在瀏覽器裡登入網站。然後在左邊的Name一欄找到表單提交到的頁面。怎麼找呢?看看右側,轉到Headers選項卡。首先,在General那段,Request Method應當是POST。其次最下方應該要有一段叫做Form Data的,裡面可以看到你剛才輸入的使用者名稱和密碼等。也可以看看左邊的Name,如果含有login這個詞,有可能就是提交表單的頁面(不一定!)。

  這裡要強調一點,“表單提交到的頁面”通常並不是你填寫使用者名稱和密碼的頁面!所以要利用工具來找到它。

2.找出要提交的資料

  雖然你在瀏覽器裡登陸時只填了使用者名稱和密碼,但表單裡包含的資料可不只這些。從Form Data裡就可以看到需要提交的所有資料。

3.寫代碼

  urllib庫的版本:

import sysimport ioimport urllib.requestimport http.cookiejarsys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的預設編碼#登入時需要POST的資料data = {'Login.Token1':'學號',  'Login.Token2':'密碼',  'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal',  'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'}post_data = urllib.parse.urlencode(data).encode('utf-8')#佈建要求頭headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}#登入時表單提交到的地址(用開發人員工具可以看到)login_url = ' http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal#構造登入請求req = urllib.request.Request(login_url, headers = headers, data = post_data)#構造cookiecookie = http.cookiejar.CookieJar()#由cookie構造openeropener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))#發送登入請求,此後這個opener就攜帶了cookie,以證明自己登入過resp = opener.open(req)#登入後才能訪問的網頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#構造訪問請求req = urllib.request.Request(url, headers = headers)resp = opener.open(req)print(resp.read().decode('utf-8'))

  requests庫的版本:

import requestsimport sysimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的預設編碼#登入後才能訪問的網頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#瀏覽器登入後得到的cookie,也就是剛才複製的字串cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'#把cookie字串處理成字典,以便接下來使用cookies = {}for line in cookie_str.split(';'): key, value = line.split('=', 1) cookies[key] = value#佈建要求頭headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}#在發送get請求時帶上要求標頭和cookiesresp = requests.get(url, headers = headers, cookies = cookies)print(resp.content.decode('utf-8'))

  明顯感覺requests庫用著更方便啊~~~

方法三:類比登入後用session保持登入狀態

原理:

  session是會話的意思。和cookie的相似之處在於,它也可以讓伺服器“認得”用戶端。簡單理解就是,把每一個用戶端和伺服器的互動當作一個“會話”。既然在同一個“會話”裡,伺服器自然就能知道這個用戶端是否登入過。

具體步驟:

1.找出表單提交到的頁面

2.找出要提交的資料

  這兩步和方法二的前兩步是一樣的

3.寫代碼

  requests庫的版本

import requestsimport sysimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改變標準輸出的預設編碼#登入時需要POST的資料data = {'Login.Token1':'學號',  'Login.Token2':'密碼',  'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal',  'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'}#佈建要求頭headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}#登入時表單提交到的地址(用開發人員工具可以看到)login_url = 'http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal'#構造Sessionsession = requests.Session()#在session中發送登入請求,此後這個session裡就儲存了cookie#可以用print(session.cookies.get_dict())查看resp = session.post(login_url, data)#登入後才能訪問的網頁url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'#發送訪問請求resp = session.get(url)print(resp.content.decode('utf-8'))

方法四:使用無頭瀏覽器訪問

特點:

  功能強大,幾乎可以對付任何網頁,但會導致代碼效率低

原理:

  如果能在程式裡調用一個瀏覽器來訪問網站,那麼像登入這樣的操作就輕而易舉了。在Python中可以使用Selenium庫來呼叫瀏覽器,寫在代碼裡的操作(開啟網頁、點擊……)會變成瀏覽器忠實地執行。這個被控制的瀏覽器可以是Firefox,Chrome等,但最常用的還是PhantomJS這個無頭(沒有介面)瀏覽器。也就是說,只要把填寫使用者名稱密碼、點擊“登入”按鈕、開啟另一個網頁等操作寫到程式中,PhamtomJS就能確確實實地讓你登入上去,並把響應返回給你。

具體步驟:

1.安裝selenium庫、PhantomJS瀏覽器

2.在原始碼中找到登入時的輸入文字框、按鈕這些元素

  因為要在無頭瀏覽器中進行操作,所以就要先找到輸入框,才能輸入資訊。找到登入按鈕,才能點擊它。

  在瀏覽器中開啟填寫使用者名稱密碼的頁面,將游標移動到輸入使用者名稱的文字框,右鍵,選擇“審查元素”,就可以在右邊的網頁原始碼中看到文字框是哪個元素。同理,可以在原始碼中找到輸入密碼的文字框、登入按鈕。

3.考慮如何在程式中找到上述元素

  Selenium庫提供了find_element(s)_by_xxx的方法來找到網頁中的輸入框、按鈕等元素。其中xxx可以是id、name、tag_name(標籤名)、class_name(class),也可以是xpath(xpath運算式)等等。當然還是要具體分析網頁原始碼。

4.寫代碼

import requestsimport sysimport iofrom selenium import webdriversys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') #改變標準輸出的預設編碼#建立Phantomjs瀏覽器對象,括弧裡是phantomjs.exe在你的電腦上的路徑browser = webdriver.PhantomJS('d:/tool/07-net/phantomjs-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe')#登入頁面url = r'http://ssfw.xmu.edu.cn/cmstar/index.portal'# 訪問登入頁面browser.get(url)# 等待一定時間,讓js指令碼載入完畢browser.implicitly_wait(3)#輸入使用者名稱username = browser.find_element_by_name('user')username.send_keys('學號')#輸入密碼password = browser.find_element_by_name('pwd')password.send_keys('密碼')#選擇“學生”選項按鈕student = browser.find_element_by_xpath('//input[@value="student"]')student.click()#點擊“登入”按鈕login_button = browser.find_element_by_name('btn')login_button.submit()#網頁browser.save_screenshot('picture1.png')#列印網頁原始碼print(browser.page_source.encode('utf-8').decode())browser.quit()

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.