使用瀏覽器登錄,獲取瀏覽器中的cookie信息,來進行登錄。python
咱們以博客園爲例,先登陸博客園帳號。咱們訪問隨筆列表,在控制檯咱們能夠看到咱們登錄後瀏覽器的cookiegit
剔除一些數據統計及分析的cookie,剩下的就是登錄可能須要的.CNBlogsCookie
和.Cnblogs.AspNetCore.Cookies
github
# _ga google分析 cookie # UM_distinctid 友盟cookie # CNZZxxx CNZZcookie # __utma,__utmc,__utmz google統計網站 # Hm_lvt_xxx 百度統計網站
import urllib.request url = 'https://i.cnblogs.com/posts' user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' #瀏覽器登陸後獲得的cookie,也就是剛纔複製的字符串 cookie_str = '.CNBlogsCookie=xxx; .Cnblogs.AspNetCore.Cookies=xxx' headers = { 'User-Agent': user_agent, 'cookie':cookie_str } req = urllib.request.Request(url,headers=headers) resp = urllib.request.urlopen(req).read().decode('utf-8') print(resp)
登錄的表單通常是使用的form data
,如今也有些表單使用request payload
使用json格式傳參。web
form data
如藥智網request payload
如博客園博客園的登錄須要拖動驗證因此略過。咱們以藥智網爲例,咱們打開控制檯能夠看到登錄須要傳的表單參數,這裏是使用的form data
表單。咱們模擬登錄後獲取到登錄後的cookie,而後訪問登陸後的我的中心頁面。chrome
import urllib.request import http.cookiejar url = 'https://www.yaozh.com/login' user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' # formData數據 data = {'username': '用戶名', 'pwd': '密碼', 'formhash': 'C3086BBA84', 'backurl': 'https%3A%2F%2Fwww.yaozh.com%2F'} post_data = urllib.parse.urlencode(data).encode('utf-8') # 請求頭設置 headers = { 'User-Agent': user_agent } # 構造登錄請求 req = urllib.request.Request(url, headers=headers, data=post_data) # cookie cookie = http.cookiejar.CookieJar() # 構造一個opener攜帶登陸後的cookie opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie)) # 發送登錄請求 resp = opener.open(req) print(resp) # 登陸後我的中心 url = 'https://www.yaozh.com/member/' # 構造訪問請求 req = urllib.request.Request(url, headers=headers) resp = opener.open(req).read().decode('utf-8') print(resp)
若是登錄須要request payload
咱們須要將參數轉爲json字符串並在頭部設置Content-Typenpm
import json ... data = {'loginType': '1', 'pwdOrVerifyCode': '密碼', 'userIdentification': '帳號', 'uaToken': '', 'webUmidToken':''} headers = { 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': user_agent } req = urllib.request.Request(url, headers=headers, data=json.dumps(data)) ...
咱們用requests
模塊的Session對象來保存回話信息json
import requests url = 'https://www.yaozh.com/login' user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36' # formData數據 data = {'username': 'chenjy1225', 'pwd': '19931225yjy', 'formhash': 'C3086BBA84', 'backurl': 'https%3A%2F%2Fwww.yaozh.com%2F'} #構造Session session = requests.Session() # 發送post請求 resp = session.post(url, data) # 登陸後我的中心 url = 'https://www.yaozh.com/member/' # 發送請求訪問我的中心 resp = session.get(url).content.decode('utf-8') print(resp)
咱們也能夠在程序中調用一個瀏覽器來訪問登錄網站。在python中使用Selenium庫就能輕鬆實現調用瀏覽器,被控制的瀏覽器能夠是chrome、firefox等。
之前較經常使用的仍是PhantomJS可是PhantomJS被python棄用了。瀏覽器
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless 'cookie
firefox對應的geckodriversession
1.下載Selenium、firefox瀏覽器及firefox驅動。
2.將下載的firefox驅動geckodriver放在firefox瀏覽器安裝目錄
3.將firefox瀏覽器安裝目錄添加到path中
4.重啓ide
咱們找到須要登錄時候輸入的元素id及登錄button id。
from selenium import webdriver import time # 新建selenium瀏覽器對象,後面是geckodriver.exe下載後本地路徑 browser = webdriver.Firefox() url = 'https://www.yaozh.com/login' # 瀏覽器訪問登陸頁面 browser.get(url) # 等待3s用於加載腳本文件 browser.implicitly_wait(3) # 輸入用戶名 username = browser.find_element_by_id('username') username.send_keys('chenjy1225') # 輸入密碼 password = browser.find_element_by_id('pwd') password.send_keys('19931225yjy') # 點擊登陸按鈕 login_button = browser.find_element_by_id('button') login_button.submit() # 網頁截圖 browser.save_screenshot('screenshot.png') # 強制等待5s,等待登陸後的跳轉 time.sleep(5) url = 'https://www.yaozh.com/member/' browser.get(url) # 網頁截圖我的中心 browser.save_screenshot('screenshot1.png') # 關閉瀏覽器 browser.quit()
screenshot.png:
screenshot1.png: