国外友人开创Python模拟登陆神库,完美修改它为咱们所用
off999 2024-10-25 13:40 133 浏览 0 评论
Awesome-python-login-model 是一个国人开发的模拟登陆仓库,在这个仓库上有20几个网站的模拟登陆脚本,你可以基于这个仓库实现的代码做简易的修改,以实现自己的自动化功能。
仓库地址:
https://github.com/Kr1s77/awesome-python-login-model
其支持模拟登陆的网站有:
私信小编01即可获取大量Python学习资源
- 虾米音乐
- Facebook模拟登录
- 微博网页版模拟登录
- QQZone模拟登录
- CSDN模拟登录--已恢复
- 淘宝爬虫--重构中
- Baidu模拟登录一
- 果壳爬虫程序
- JingDong 模拟登录和自动申请京东试用
- 163mail--已恢复
- 拉钩模拟登录--已失效
- Bilibili模拟登录
- 豆瓣
- Baidu2模拟登录
- 猎聘网模拟登录
- 微信网页版登录并获取好友列表
- Github模拟登录两种解决方案都可行
- 爬取图虫想要的图片
- 网易云音乐downloader
- 糗事百科爬虫
- 淘宝登陆-访问
可以看到,支持的站点非常多,大家可以从他仓库里学到许多关于模拟登陆的方法,简单的来讲,大多数脚本采用的是直接登录的方式,有的网站直接登录难度很大,比如qq空间,bilibili等使用 selenium + webdriver 的方式就相对轻松一些。
一些网站虽然在登录的时候采用的是selenium的方式,为了效率,我们可以在登录过后得到的cookie维护起来,然后调用 requests 或者 scrapy 等进行数据采集,这样数据采集的速度可以得到保证。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上。
使用这个仓库的时候,你需要按需安装并加载相应的模块,不过无非就是以下几个模块:
pip install beautifulsoup4
pip install selenium
pip install pyppeteer
pip install pillow
上面的模块你并不需要全部安装,最好是找到你所需要模拟登陆的网站的脚本,查看它头部 import 了什么模块,按需安装即可。
2.简单的模拟登陆实战
下面来看一个拉勾网的登陆脚本:
上滑查看更多代码
# -*- coding:utf-8 -*-
import re
import os
import time
import json
import sys
import subprocess
import requests
import hashlib
from bs4 import BeautifulSoup
"""
info:
author:CriseLYJ
github:https://github.com/CriseLYJ/
update_time:2019-3-6
"""
class Lagou_login(object):
def __init__(self):
self.session = requests.session()
self.CaptchaImagePath = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'captcha.jpg'
self.HEADERS = {'Referer': 'https://passport.lagou.com/login/login.html',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36'
' Core/1.53.4882.400 QQBrowser/9.7.13059.400',
'X-Requested-With': 'XMLHttpRequest'}
# 密码加密
def encryptPwd(self, passwd):
# 对密码进行了md5双重加密
passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
# veennike 这个值是在js文件找到的一个写死的值
passwd = 'veenike' + passwd + 'veenike'
passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
return passwd
# 获取请求token
def getTokenCode(self):
login_page = 'https://passport.lagou.com/login/login.html'
data = self.session.get(login_page, headers=self.HEADERS)
soup = BeautifulSoup(data.content, "lxml", from_encoding='utf-8')
'''
要从登录页面提取token,code, 在头信息里面添加
<!-- 页面样式 --><!-- 动态token,防御伪造请求,重复提交 -->
<script type="text/javascript">
window.X_Anti_Forge_Token = 'dde4db4a-888e-47ca-8277-0c6da6a8fc19';
window.X_Anti_Forge_Code = '61142241';
</script>
'''
anti_token = {'X-Anit-Forge-Token': 'None',
'X-Anit-Forge-Code': '0'}
anti = soup.findAll('script')[1].getText().splitlines()
anti = [str(x) for x in anti]
anti_token['X-Anit-Forge-Token'] = re.findall(r'= \'(.+?)\'', anti[1])[0]
anti_token['X-Anit-Forge-Code'] = re.findall(r'= \'(.+?)\'', anti[2])[0]
return anti_token
# 人工读取验证码并返回
def getCaptcha(self):
captchaImgUrl = 'https://passport.lagou.com/vcode/create?from=register&refresh=%s' % time.time()
# 写入验证码图片
f = open(self.CaptchaImagePath, 'wb')
f.write(self.session.get(captchaImgUrl, headers=self.HEADERS).content)
f.close()
# 打开验证码图片
if sys.platform.find('darwin') >= 0:
subprocess.cx5c r[p'6;-]l=09all(['open', self.CaptchaImagePath])
elif sys.platform.find('linux') >= 0:
subprocess.call(['xdg-open', self.CaptchaImagePath])
else:
os.startfile(self.CaptchaImagePath)
# 输入返回验证码
captcha = input("请输入当前地址(% s)的验证码: " % self.CaptchaImagePath)
print('你输入的验证码是:% s' % captcha)
return captcha
# 登陆操作
def login(self, user, passwd, captchaData=None, token_code=None):
postData = {'isValidate': 'true',
'password': passwd,
# 如需验证码,则添加上验证码
'request_form_verifyCode': (captchaData if captchaData != None else ''),
'submit': '',
'username': user
}
login_url = 'https://passport.lagou.com/login/login.json'
# 头信息添加tokena
login_headers = self.HEADERS.copy()
token_code = self.getTokenCode() if token_code is None else token_code
login_headers.update(token_code)
# data = {"content":{"rows":[]},"message":"该帐号不存在或密码错误,请重新输入","state":400}
response = self.session.post(login_url, data=postData, headers=login_headers)
data = json.loads(response.content.decode('utf-8'))
if data['state'] == 1:
return response.content
elif data['state'] == 10010:
print(data['message'])
captchaData = self.getCaptcha()
token_code = {'X-Anit-Forge-Code': data['submitCode'], 'X-Anit-Forge-Token': data['submitToken']}
return self.login(user, passwd, captchaData, token_code)
else:
print(data['message'])
return False
if __name__ == "__main__":
username = input("请输入你的手机号或者邮箱\n >>>:")
passwd = input("请输入你的密码\n >>>:")
lg = Lagou_login()
passwd = lg.encryptPwd(passwd)
data = lg.login(username, passwd)
if data:
print(data)
print('登录成功')
else:
print('登录不成功')
从头部的 import 引入来看,你需要安装并加载 Beautifulsoup4 模块:
pip install beautifulsoup4
安装完成后,终端需要 cd 进入此脚本所在文件夹,执行脚本:
python Lagou.py
运行脚本后需要你输入一定的信息进行登陆,做得非常方便和贴心:
登陆完成后,你就可以做任何你想要做的事情了。
3.基于selenium的模拟登陆
有些网站的爬取没有那么简单,他们会做权限校验、会做反爬机制。这种情况下,我们可以用selenium解决一些比较困难和复杂的登陆场景。
基于selenium的模拟登陆稍微复杂一点,你需要设置chromedriver的路径到环境变量中。如果你没有设置,运行登陆脚本的时候会出现以下错误:
怎么下载并设置 Chromedriver 到环境变量里呢?你可以在这里下载到最新版的Chromedriver:
https://chromedriver.chromium.org/
现在最新版 Chromedriver 版本号到了 91.0.4472.101 ,下载链接如下:
https://chromedriver.storage.googleapis.com/index.html?path=91.0.4472.101
可以看到,每个系统需要下载的 Chromedriver 版本不一样,请对应你的系统下载指定的版本即可。
对于macOS系统而言,mac64 和 mac_m1指的是使用了不同芯片的Mac笔记本,你可以在Mac上,单击菜单栏左上角的[Apple]图标,然后选择“关于本机”选项。看到如下写着芯片 Apple M1 则应该下载mac_m1版本。
如果你的网络存在问题无法下载,没关系,关注 Python实用宝典 公众号,后台回复 Chromedriver 即可下载,我已经把这4个版本放到了国内网盘上。
下载 Chromedriver 完成后,你还需要设置环境变量
(macOS 系统)请这样设置环境变量:
1. 把解压得到的 Chromedriver 放到一个你不会经常变动的路径
如 /usr/local/bin/ ,你需要 Command+空格 输入并打开终端(Terminal),执行以下命令:
cd /usr/local/bin/
open .
然后将 Chromedriver 拖入,就能成功将 Chromedriver 放入其中。
2.添加环境变量
在终端输入下列命令就能添加到环境变量:
export PATH=$PATH:/usr/local/bin/chromedriver
执行完这一步,恭喜你成功在 macOS 上安装了 Chromedriver.
(Windows 系统)请这样设置环境变量:
1.在左下角搜索环境变量,打开“编辑系统环境变量”的选项:
2.设置 Chromedriver 环境变量:
将你的 chromedriver 所在目录放入到 PATH 变量中,如图所示。比如我的 chromedriver.exe 的路径是 C:\Users\83493\Documents\bin\chromedriver.exe 那么此处就应该填写 C:\Users\83493\Documents\bin 路径。
设置完成后,你便成功在 Windows 上安装了 Chromedriver. 另外请注意设置后要重启终端或CMD让环境变量生效。
另外如果你在使用 Chromedriver 的时候出现了类似于以下的报错,不要慌:
这是由于当前 Chromedriver 版本是91, 而你现在的 Chrome 版本是 90 造成的,升级Chrome即可解决问题。
完成selenium的基本配置后,我们可以尝试运行QQ空间模拟登陆:
进入项目文件夹的qqzone文件夹:
cd awesome-python-login-model\qqzone
然后直接运行 qq_zone.py 文件:
python qq_zone.py
此时会弹出一个浏览器并让你输入信息:
输入信息后,就会正常走登陆流程:
看到如上的界面,说明登陆完成,此时Cookie什么的都已经被设定完毕,你可以把Cookie存下来,并做任何你想做的事情了。
如果你愿意研究作者的代码,你会发现其实很简单:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
info:
author:CriseLYJ
github:https://github.com/CriseLYJ/
update_time:2019-3-7
"""
import time # 用来延时
from selenium import webdriver
driver = webdriver.Chrome() # 选择浏览器,此处我选择的Chrome
QQ_NUMBER = input('请输入你的QQ号')
PASSWORD = input('请输入你的QQ密码')
driver.get('http://i.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_name('u').clear()
driver.find_element_by_name('u').send_keys(QQ_NUMBER) # 此处输入你的QQ号
driver.find_element_by_name('p').clear()
driver.find_element_by_name('p').send_keys(PASSWORD) # 此处输入你的QQ密码
driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;")
driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click()
driver.find_element_by_id('login_button').click()
time.sleep(10) # 因为我曾经是QQ会员,所以每次登陆时都会提醒我要不要再续费的弹窗...
driver.find_element_by_id('dialog_button_1').click() # 这个地方是我把那个弹窗给点击了,配合上面的延时用的,延时是等待那个弹窗出现,然后此处点击取消
btns = driver.find_elements_by_css_selector('a.item.qz_like_btn_v3') # 此处是CSS选择器
for btn in btns:
btn.click()
简单的讲,代码一共分了4个步骤,分别如下:
1.让使用者输入QQ号和密码。
2.切换浏览器焦点到登录框中,选择元素输入账号和密码。
3.为了显示登录按钮,执行了以下脚本:
driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;")
4.点击确认按钮,完成登录。
可以看到,基于 Selenium 的自动化控制一点都不难,一旦熟悉控制流程及相应的方法后应该如鱼得水。只要你度过一开始安装 Chromedriver 时的繁琐阶段,后面代码开发时多参考他人的代码,Selenium这个自动化工具是可以被熟练掌握的。
总而言之, Awesome-python-login-model 这个模拟登陆的代码库,可以给你带来不少的便利,你可以直接基于它提供的登陆脚本开发,也可以参考这些脚本自己写一个其他网站的模拟登陆脚本,并给作者提交PR。
相关推荐
- 大文件传不动?WinRAR/7-Zip 入门到高手,这 5 个技巧让你效率翻倍
-
“这200张照片怎么传给女儿?微信发不了,邮箱附件又超限……”62岁的张阿姨对着电脑犯愁时,儿子只用了3分钟就把照片压缩成一个文件,还教她:“以后用压缩软件,比打包行李还方便!”职场人更懂这...
- 电脑解压缩软件推荐——7-Zip:免费、高效、简洁的文件管理神器
-
在日常工作中,我们经常需要处理压缩文件。无论是下载软件包、接收文件,还是存储大量数据,压缩和解压缩文件都成为了我们日常操作的一部分。而说到压缩解压软件,7-Zip绝对是一个不可忽视的名字。今天,我就来...
- 设置了加密密码zip文件要如何打开?这几个方法可以试试~
-
Zip是一种常见的压缩格式文件,文件还可以设置密码保护。那设置了密码的Zip文件要如何打开呢?不清楚的小伙伴一起来看看吧。当我们知道密码想要打开带密码的Zip文件,我们需要用到适用于Zip格式的解压缩...
- 大文件想要传输成功,怎么把ZIP文件分卷压缩
-
不知道各位小伙伴有没有这样的烦恼,发送很大很大的压缩包会受到限制,为此,想要在压缩过程中将文件拆分为几个压缩包并且同时为所有压缩包设置加密应该如何设置?方法一:使用7-Zip免费且强大的文件管理工具7...
- 高效处理 RAR 分卷压缩包:合并解压操作全攻略
-
在文件传输和存储过程中,当遇到大文件时,我们常常会使用分卷压缩的方式将其拆分成多个较小的压缩包,方便存储和传输。RAR作为一种常见的压缩格式,分卷压缩包的使用频率也很高。但很多人在拿到RAR分卷...
- 2个方法教你如何删除ZIP压缩包密码
-
zip压缩包设置了加密密码,每次解压文件都需要输入密码才能够顺利解压出文件,当压缩包文件不再需要加密的时候,大家肯定想删除压缩包密码,或是忘记了压缩包密码,想要通过删除操作将压缩包密码删除,就能够顺利...
- 速转!漏洞预警丨压缩软件Winrar目录穿越漏洞
-
WinRAR是一款功能强大的压缩包管理器,它是档案工具RAR在Windows环境下的图形界面。该软件可用于备份数据,缩减电子邮件附件的大小,解压缩从Internet上下载的RAR、ZIP及其它类...
- 文件解压方法和工具分享_文件解压工具下载
-
压缩文件减少文件大小,降低文件失效的概率,总得来说好处很多。所以很多文件我们下载下来都是压缩软件,很多小伙伴不知道怎么解压,或者不知道什么工具更好,所以今天做了文件解压方法和工具的分享给大家。一、解压...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
-
1.组织文件笔记(第9章)(代码下载)1.1文件与文件路径通过importshutil调用shutil模块操作目录,shutil模块能够在Python程序中实现文件复制、移动、改名和删除;同时...
- Python内置tarfile模块:读写 tar 归档文件详解
-
一、学习目标1.1学习目标掌握Python内置模块tarfile的核心功能,包括:理解tar归档文件的原理与常见压缩格式(gzip/bz2/lzma)掌握tar文件的读写操作(创建、解压、查看、过滤...
- 使用python展开tar包_python拓展
-
类Unix的系统,打包文件经常使用的就是tar包,结合zip工具,可以方便的打包并解压。在python的标准库里面有tarfile库,可以方便实现生成了展开tar包。使用这个库最大的好处,可能就在于不...
- 银狐钓鱼再升级:白文件脚本化实现GO语言后门持久驻留
-
近期,火绒威胁情报中心监测到一批相对更为活跃的“银狐”系列变种木马。火绒安全工程师第一时间获取样本并进行分析。分析发现,该样本通过阿里云存储桶下发恶意文件,采用AppDomainManager进行白利...
- ZIP文件怎么打开?2个简单方法教你轻松搞定!
-
在日常工作和生活中,我们经常会遇到各种压缩文件,其中最常见的格式之一就是ZIP。ZIP文件通过压缩数据来减少文件大小,方便我们进行存储和传输。然而,对于初学者来说,如何打开ZIP文件可能会成为一个小小...
- Ubuntu—解压多个zip压缩文件.zip .z01 .z02
-
方法将所有zip文件放在同一目录中:zip_file.z01,zip_file.z02,zip_file.z03,...,zip_file.zip。在Zip3.0版本及以上,使用下列命令:将所有zi...
- 如何使用7-Zip对文件进行加密压缩
-
7-Zip是一款开源的文件归档工具,支持多种压缩格式,并提供了对压缩文件进行加密的功能。使用7-Zip可以轻松创建和解压.7z、.zip等格式的压缩文件,并且可以通过设置密码来保护压缩包中的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)