整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

python爬虫:常见的登陆方式

见的登录方式有以下两种:

  1. 查看登录页面,csrf,cookie;授权;cookie
  2. 直接发送post请求,获取cookie

上面只是简单的描述,下面是详细的针对两种登录方式的时候爬虫的处理方法

第一种情况

这种例子其实也比较多,现在很多网站的登录都是第一种的方法,这里通过以github为例子:

分析页面

获取authenticity_token信息

我们都知道登录页面这里都是一个form表单提交,我可以可以通过谷歌浏览器对其进行分析

如上图我们找到了这个token信息

所以我们在登录之前应该先通过代码访问这个登录页面获取这个authenticity_token信息

获取登陆页面的cookie信息

set-cookie这里是登录页面的cookie

分析登录包获取提交地址

当我们输入用户名和密码之后点击提交,我们可以从包里找到如上图的地址,就是post请求提交form的信息

请求的地址:https://github.com/session

请求的参数有:

"commit": "Sign in",

"utf8":"✓",

"authenticity_token":“KM6Q0mM9FtI95wYsI/WU3BnaMbYrmV60c0YTQlZjBuAuYa193LP2Gd8BTCmQBSFvPFZRlk3/1TFOnOgGUdy7Ig==”,

"login":"hjzhaofan@163.com",

"password":"123"

从这里我们也可以看出提交参数中的“authenticity_token”,而这个参数就是需要我们从登陆页面先获取到。

当我们登录成功后:

再次访问github,这个时候cookie里就增加了两个cookie信息,而这个信息是登录后在增加的信息

所以如果我们想要通过程序登录,我们就需要在登录成功后再次获取cookie信息

然后通过这个cookie去访问我们github的其他信息例如我们的个人信息设置页面:

https://github.com/settings/profile

代码实现

下面代码实现了登录并访问https://github.com/settings/repositories

import requests
from bs4 import BeautifulSoup
Base_URL = "https://github.com/login"
Login_URL = "https://github.com/session"
def get_github_html(url):
 '''
 这里用于获取登录页的html,以及cookie
 :param url: https://github.com/login
 :return: 登录页面的HTML,以及第一次的cooke
 '''
 response = requests.get(url)
 first_cookie = response.cookies.get_dict()
 return response.text,first_cookie
def get_token(html):
 '''
 处理登录后页面的html
 :param html:
 :return: 获取csrftoken
 '''
 soup = BeautifulSoup(html,'lxml')
 res = soup.find("input",attrs={"name":"authenticity_token"})
 token = res["value"]
 return token
def gihub_login(url,token,cookie):
 '''
 这个是用于登录
 :param url: https://github.com/session
 :param token: csrftoken
 :param cookie: 第一次登录时候的cookie
 :return: 返回第一次和第二次合并后的cooke
 '''
 data= {
 "commit": "Sign in",
 "utf8":"✓",
 "authenticity_token":token,
 "login":"你的github账号",
 "password":"*****"
 }
 response = requests.post(url,data=data,cookies=cookie)
 print(response.status_code)
 cookie = response.cookies.get_dict()
 #这里注释的解释一下,是因为之前github是通过将两次的cookie进行合并的
 #现在不用了可以直接获取就行
 # cookie.update(second_cookie)
 return cookie
if __name__ == '__main__':
 html,cookie = get_github_html(Base_URL)
 token = get_token(html)
 cookie = gihub_login(Login_URL,token,cookie)
 response = requests.get("https://github.com/settings/repositories",cookies=cookie)
 print(response.text)

第二种情况

这里通过伯乐在线为例子,这个相对于第一种就比较简单了,没有太多的分析过程直接发送post请求,然后获取cookie,通过cookie去访问其他页面,下面直接是代码实现例子:

http://www.jobbole.com/bookmark/ 这个地址是只有登录之后才能访问的页面,否则会直接返回登录页面

这里说一下:http://www.jobbole.com/wp-admin/admin-ajax.php是登录的请求地址这个可以在抓包里可以看到

import requests
def login():
 url = "http://www.jobbole.com/wp-admin/admin-ajax.php"
 data = {
 "action": "user_login",
 "user_login":"zhaofan1015",
 "user_pass": '******',
 }
 response = requests.post(url,data)
 cookie = response.cookies.get_dict()
 print(cookie)
 url2 ="http://www.jobbole.com/bookmark/"
 response2 = requests.get(url2,cookies=cookie)
 print(response2.text)
login() 

做什么事情都需要不断地坚持下去,编程也一样。现在python语言十分火热,职场对python的需求也很高,薪资待遇都很棒。所以希望大家能够坚持学习,‘剩’者为王,坚持下来的人才有资格称王。如果你觉得本文对你的学习有帮助的话,不妨点个关注,我会持续更新。

网上爬取数据的时候通常需要注册会员,然后登录才能正常使用或下载数据。这些登录的信息通常会存放在网站的cookie中。根据百度百科的定义,“Cookie 是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。”

为了方便自动化爬取数据,我们可以将网站的登录信息的cookie存储在本地文件中,然后下次登录时,直接加载cookies即可迅速实现登录。在Python中,获取网站cookie的办法有好多种,这里简单介绍较常用的selenium库,调用浏览器驱动程序获取最新的cookie,并模拟网站自动登录。

首先确保python成功安装了selenium库,安装命令如下:

pip install selenium

其次是要安装对应浏览器的驱动程序,一般使用谷歌浏览器、火狐浏览器和Edge浏览器,它们对应的驱动程序分别为chromedriver.exe,geckodriver.exe,msedgedriver.exe,需要下载对应浏览器版本的程序。例如我使用的谷歌浏览器版本为112.0.5615,我需要下载对应版本的chromedriver.exe。具体安装教程,可参考链接:https://www.bilibili.com/read/cv13873971

一切准备后就可以开始编写代码了,这里使用Anaconda的Jupyter编写运行命令。先导入selenium库以及json,os库,selenium用于启动浏览器,json用于将cookie转存为json格式,os用于将文件保存在本地,time用于强制程序等待若干时间。

from selenium import webdriver
import json,os,time

#选择保存目录
outdir = r'F:\MyProject\09Medicine'

#登录的网址
douban_url = 'https://www.douban.com/'

#启动浏览器
browser = webdriver.Chrome()

#浏览器打开网页
browser.get(douban_url)

#等待30秒时间使你输入登录信息
time.sleep(30)

#浏览器登录后获取cookie
cookies = browser.get_cookies()

#将cookies保存在本地
with open(os.path.join(outdir,'cookies.txt'),mode='w') as f:
	f.write(json.dumps(cookies))

#关闭浏览器
browser.close()

浏览器打开豆瓣网首页

这样即可将网站登录信息保存在当地了。下次登录时可直接调用本地cookie文件实现自动登录了。

#打开保存的cookie文件
with open(r'F:\MyProject\09Medicine\cookies.txt',mode='r') as f:
	cookies_file = f.read()

#将读取的文件转为json格式
cookie_list = json.loads(cookies_file)

#打开浏览器
browser = webdriver.Chrome()

#输入豆瓣网址
page_url = 'https://www.douban.com'
browser.get(page_url)

#网页加载cookie
for cookie in cookie_list:
	browser.add_cookie(cookie)

#需要刷新网页才能登录
browser.refresh()
#再输入一次网址即可显示登录成功
browser.get(page_url)

使用cookie登录的豆瓣网首页

豆瓣网站的cookie反爬机制做得貌似比较好,一定时间后需要更新登录的cookie才可重新自动登录。因此爬取的时候可定期更新cookie信息。


、小程序端调用wx.login

2、判断用户是否授权

3、小程序端访问 wx.getUserInfo

4、小程序端js代码:+

当然小编这里也准备一份适合你的学习资料爬虫 ,web开发的学习资料视频教程,私信小编“01”都可以免费获取!这些书籍都是可以私信小编“01”免费领取的!

wx.login({
 success: resp => {
 // 发送 res.code 到后台换取 openId, sessionKey, unionId
 console.log(resp);
 var that = this;
 // 获取用户信息
 wx.getSetting({
 success: res => {
 if (res.authSetting['scope.userInfo']) {
 // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
 wx.getUserInfo({
 success: userResult => {
 var platUserInfoMap = {}
 platUserInfoMap["encryptedData"] = userResult.encryptedData;
 platUserInfoMap["iv"] = userResult.iv;
 wx.request({
			 url: 'http://127.0.0.1:5000/user/wxlogin',
			 data: {
			 platCode: resp.code,
  platUserInfoMap: platUserInfoMap,
			 },
			 header: {
			 "Content-Type": "application/json"
			 },
			 method: 'POST',
			 dataType:'json',
			 success: function (res) {
			 console.log(res)
  	wx.setStorageSync("userinfo", res.userinfo) //设置本地缓存
			 },
			 fail: function (err) { },//请求失败
			 complete: function () { }//请求完成后执行的函数
			 })
 }
 })
 }
 }
 })
 }
 })

5、后端服务器访问code2session,通过code2Session这个api接口来获取真正需要的微信用户的登录态 session_key 和 openid 和 unionid

6、后端服务器校验用户信息,对 encryptedData 解密

微信小程序登录后获得session_key后,返回了encryptedData,iv的数据,其中encryptedData解密后包含了用户的信息,解密后的json格式如下:

{
 "openId": "OPENID",
 "nickName": "NICKNAME",
 "gender": GENDER,
 "city": "CITY",
 "province": "PROVINCE",
 "country": "COUNTRY",
 "avatarUrl": "AVATARURL",
 "unionId": "UNIONID",
 "watermark":
 {
 "appid":"APPID",
 "timestamp":TIMESTAMP
 }
}

7、新建解密文件——WXBizDataCrypt.py

from Crypto.Cipher import AES 这边一般会遇到 ModuleNotFoundError:No module named "Crypto" 错误

(1)执行 pip3 install pycryptodome

(2)如果还是提示没有该模块,那就虚拟环境目录 Lib—-site-package 中查看是否有 Crypto文件夹,这时你应该看到有 crypto 文件夹,将其重命名为 Crypto 即可

import base64
import json
from Crypto.Cipher import AES

class WXBizDataCrypt:
 def __init__(self, appId, sessionKey):
 self.appId = appId
 self.sessionKey = sessionKey

 def decrypt(self, encryptedData, iv):
 # base64 decode
 sessionKey = base64.b64decode(self.sessionKey)
 encryptedData = base64.b64decode(encryptedData)
 iv = base64.b64decode(iv)

 cipher = AES.new(sessionKey, AES.MODE_CBC, iv)

 decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData)))

 if decrypted['watermark']['appid'] != self.appId:
 raise Exception('Invalid Buffer')

 return decrypted

 def _unpad(self, s):
 return s[:-ord(s[len(s)-1:])]

8、Flask的 /user/wxlogin api代码:

import json,requests
from WXBizDataCrypt import WXBizDataCrypt
from flask import Flask

@app.route('/user/wxlogin', methods=['GET','POST'])
def user_wxlogin():
 data = json.loads(request.get_data().decode('utf-8')) # 将前端Json数据转为字典
 appID = 'appID' # 开发者关于微信小程序的appID
 appSecret = 'appSecret' # 开发者关于微信小程序的appSecret
 code = data['platCode'] # 前端POST过来的微信临时登录凭证code
 encryptedData = data['platUserInfoMap']['encryptedData']
 iv = data['platUserInfoMap']['iv']
 req_params = {
 'appid': appID,
 'secret': appSecret,
 'js_code': code,
 'grant_type': 'authorization_code'
 }
 wx_login_api = 'https://api.weixin.qq.com/sns/jscode2session'
 response_data = requests.get(wx_login_api, params=req_params) # 向API发起GET请求
 resData = response_data.json()
 openid = resData ['openid'] # 得到用户关于当前小程序的OpenID
 session_key = resData ['session_key'] # 得到用户关于当前小程序的会话密钥session_key

 pc = WXBizDataCrypt(appID, session_key) #对用户信息进行解密
 userinfo = pc.decrypt(encryptedData, iv) #获得用户信息
 print(userinfo)
 '''
 下面部分是通过判断数据库中用户是否存在来确定添加或返回自定义登录态(若用户不存在则添加;若用户存在,返回用户信息)

 --------略略略略略略略略略-------------

 这部分我就省略啦,数据库中对用户进行操作
 '''

 return json.dumps
({
"code": 200, "msg": "登录成功","userinfo":userinfo}, indent=4, sort_keys=True, default=str, ensure_ascii=False)

总结

到此这篇关于Python Flask微信小程序登录详解及登录api实现的文章就介绍到这了,更多相关Python Flask微信小程序登录详解及登录api实现内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间:2020-06-05

Python的Flask框架中实现登录用户的个人资料和头像的教程

用户资料页面 在用户资料页面,基本上没有什么特别要强调和介绍的新概念.只需要创建一个含有HTML的新视图函数模板页面即可. 下面是视图函数(项目目录/views.py): @app.route('/user/<nickname>') @login_required def user(nickname): user = User.query.filter_by(nickname = nickname).first() if user == None: flash('不存在用户:' + nickn

Python Flask 搭建微信小程序后台详解

前言: 近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序.因为是初次接触小程序,经过一番摸索和尝试,个人觉得的微信小程序与后台的交互有点像ajax,所以有ajax开发经验的同学开发小程序应该很容易上手,因为本文着重讲解后台程序的搭建,所以,微信小程序的前端开发将一笔带过,有兴趣学习小程序前端语言的同学可移步网易云课堂的一套快速入门课程<轻松玩转微信小程序>. 分三步讲解微信小程序与Python后台

使用Python的Flask框架表单插件Flask-WTF实现Web登录验证

表单是让用户与我们的网页应用程序交互的基本元素.Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包.这个包使得定义表单和处理提交容易一些. Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后,GitHub项目页:https://github.com/lepture/flask-wtf )就是在 myapp.forms 包中定义一个表单. # ourapp/forms.py fr

Python的Flask框架中实现简单的登录功能的教程

回顾 在前面的系列章节中,我们创建了一个数据库并且学着用用户和邮件来填充,但是到现在我们还没能够植入到我们的程序中. 两章之前,我们已经看到怎么去创建网络表单并且留下了一个实现完全的登陆表单. 在这篇文章中,我们将基于我门所学的网络表单和数据库来构建并实现我们自己的用户登录系统.教程的最后我们小程序会实现新用户注册,登陆和退出的功能. 为了能跟上这章节,你需要前一章节最后部分,我们留下的微博程序.请确保你的程序已经正确安装和运行. 在前面的章节,我们开始配置我们将要用到的Flask扩展.为了登

python使用Flask操作mysql实现登录功能

用到的一些知识点:Flask-SQLAlchemy.Flask-Login.Flask-WTF.PyMySQL 这里通过一个完整的登录实例来介绍,程序已经成功运行,在未登录时拦截了success.html页面跳转到登录页面,登录成功后才能访问success. 以下是项目的整体结构图: 首先是配置信息,配置了数据库连接等基本的信息,config.py DEBUG = True SQLALCHEMY_ECHO = False SQLALCHEMY_DATABASE_URI = 'mysql+pymy

python实现网站用户名密码自动登录功能

一.概述 公司需要通过网页用户认证登录实现上网,网络设备判断当前帐号12小时没有没上网将会自动断开帐号上网,每天早上上班第一件事就是打开用户认证网页输入. 用户名与密码,有时候要家里通过teamview远程控制软件连接公司电脑,想让公司电脑24小时在线,最后通过python实现了自动登录. 代码: #_*_ coding:utf-8 _*_ import requests,time s=requests.session() data = [ ('opr', 'pwdLogin'), ('user

在Python程序中操作MySQL的基本方法

Python操作Mysql 最近在学习python,这种脚本语言毫无疑问的会跟数据库产生关联,因此这里介绍一下如何使用python操作mysql数据库.我python也是零基础学起,所以本篇博客针对的是python初学者,大牛可以选择绕道. 另外,本篇基于的环境是Ubuntu13.10,使用的python版本是2.7.5. MYSQL数据库 MYSQL是一个全球领先的开源数据库管理系统.它是一个支持多用户.多线程的数据库管理系统,与Apache.PHP.Linux共同组成LAMP平台,在web应

python简单实现操作Mysql数据库

用python编写数据库的代码很方便,但是如果不想自己写sql语句,其实还有更多的讨巧办法.使用webpy的db库就是不错的一个选择.当然为了使用webpy的db,之前你还需要安装MySQLdb,其他的就不需要做什么了. 1.安装MySQLdb库 sudo apt-get install python-MySQLdb 2.安装webpy sudo apt-get install python-webpy 3.连接数据库 import web db = web.database(dbn='mysq

python使用SQLAlchemy操作MySQL

SQLAlchemy是Python编程语言下的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行.SQLAlchemy首次发行于2006年2月,并迅速地在Python社区中最广泛使用的ORM工具之一,不亚于Django的ORM框架. 本文将介绍如何使用SQLAlchemy操作MySQL,完成基础的表创建,表格数据的新增.查询.修改.删除(CRUD)等操作. 首先我们需要确认当前的Python环境下已经安装sqlalchemy和pymysql模块. 新建表格 我们使

Java+mysql用户注册登录功能

最近刚刚开始学习mysql,所以就写了这个很基本的用户注册登录的功能来练练手.虽然这个很简单,但是我还是看到了自己学习的进步,很开心.哈哈哈. 这里要注意数据表的建立: 直接上代码吧,里面注释很详细了. package client; import java.sql.*; import java.util.*; public class Client { /** * 用以实现用户的注册和登录 */ private static String username;//用户登录注册的姓名 privat

Python的Flask框架中实现分页功能的教程

Blog Posts的提交 让我们从简单的开始.首页上必须有一张用户提交新的post的表单. 首先我们定义一个单域表单对象(fileapp/forms.py): class PostForm(Form): post = TextField('post', validators = [Required()]) 下面,我们把这个表单添加到template中(fileapp/templates/index.html): <!-- extend base layout --> {% extends &

flask 框架操作MySQL数据库简单示例

本文实例讲述了flask 框架操作MySQL数据库.分享给大家供大家参考,具体如下: 一.创建数据库表格 """ Created on 19-10-8 @requirement:Anaconda 4.3.0 (64-bit) Python3.6 @description:创建表格 """ import pymysql server = '127.0.0.1' user = 'root' password = 'password' # 连接数据库

Python操作MySQL数据库的三种方法总结

1. MySQLdb 的使用 (1) 什么是MySQLdb? MySQLdb 是用于 Python 连接 MySQL 数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的. (2) 源码安装 MySQLdb: https://pypi.python.org/pypi/MySQL-python $ tar zxvf MySQL-python-*.tar.gz $ cd MySQL-python-* $ python setup.py buil