chenjy1225

使用已有cookie登陆

使用浏览器登陆,获取浏览器中的cookie信息,来进行登陆。

我们以博客园为例,先登录博客园账号。我们访问随笔列表,在控制台我们可以看到我们登陆后浏览器的cookie

剔除一些数据统计及分析的cookie,剩下的就是登陆可能需要的.CNBlogsCookie.Cnblogs.AspNetCore.Cookies


# _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格式传参。

  • request payload如博客园

form data

博客园的登陆需要拖动验证所以略过。我们以药智网为例,我们打开控制台可以看到登陆需要传的表单参数,这里是使用的form data表单。我们模拟登陆后获取到登陆后的cookie,然后访问登录后的个人中心页面。


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-Type


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对象来保存回话信息


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 \'

firefox对应的geckodriver

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:

分类:

技术点:

相关文章: