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:

相关文章
相关标签/搜索