python模擬登錄網站

使用已有cookie登錄

使用瀏覽器登錄,獲取瀏覽器中的cookie信息,來進行登錄。python

咱們以博客園爲例,先登陸博客園帳號。咱們訪問隨筆列表,在控制檯咱們能夠看到咱們登錄後瀏覽器的cookiegit

剔除一些數據統計及分析的cookie,剩下的就是登錄可能須要的.CNBlogsCookie.Cnblogs.AspNetCore.Cookiesgithub

# _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)

登錄獲取cookie

登錄的表單通常是使用的form data,如今也有些表單使用request payload使用json格式傳參。web

  • request payload如博客園

form data

博客園的登錄須要拖動驗證因此略過。咱們以藥智網爲例,咱們打開控制檯能夠看到登錄須要傳的表單參數,這裏是使用的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

若是登錄須要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))
...

登錄後用session保持登錄狀態

咱們用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

chrome對應的chromedriver

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:

相關文章
相關標籤/搜索