使用浏览器登录,获取浏览器中的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: