百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

国外友人开创Python模拟登陆神库,完美修改它为咱们所用

ninehua 2024-12-06 18:07 38 浏览

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。

相关推荐

单打独斗的产品设计师工作流程总结

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。我从入行开始就在一个做自己产品的小公司工作,到现在已经三年了。刚开始工作的时候什么也不懂,老板说让出效果图,就开始直接...

毕业生必备软件!6套APP构建我的产品设计工作流

工欲善其事,必先利其器。思维和方法论固然超级重要,但是掌握并制定适合自己的工作流也可以成倍提升效率。好的软件加上熟练的使用可以帮助解决遇到的所有问题,不仅可以减轻大脑和身体的负担,更可以让产品设计师在...

如何在APP原型上写需求?(app原型设计规范)

你有没有过这样的经历——辛辛苦苦写了半天的文档,结果开发一眼没看,做需求的时候又把文档里的内容问了一遍?如果你也有这样的经历,那么在APP原型上写需求,或许能帮你解决这个问题。为什么要把需求直接写在...

产品经理工具箱|原型及交互设计工具

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。世界上最实在最方便的原型设计及交互工具:国外的谷歌,facebook等大型互联网公司的交互工具就是上面最原始,最有效最...

交互设计利器汇总:实用工具大揭秘!

近年来,页面交互设计有了很好的发展,越来越受到人们的重视。如果你想成为一名页面交互设计师,除了对平面设计和产品设计有一定的了解外,更重要的是要知道哪个软件适合页面交互设计。本文将带您了解5款流行的页面...

Taro - 京东凹凸实验室出品的小程序多端开发工具,内置 UI 组件库

可以支持转换到微信/京东/百度/支付宝/字节跳动/QQ小程序以及H5端,同时也支持使用Vue语法了。关于Taro凹凸实验室(O2Lab)来自京东零售集团,创建于2015年10月,是...

开发2小时,修bug2周,我用Trae做了个小程序

在当今快速发展的科技时代,AI技术的崛起为开发者带来了前所未有的机遇与挑战。一方面,AI极大地降低了技术门槛,让更多的创意得以快速实现;另一方面,它也提升了竞争维度,促使人们在认知、方法和时间效率上不...

好用的10款免费原型设计工具(免费的原型设计软件)

对产品经理或UI/UX设计师来说,一款好的原型设计工具至关重要。好的原型设计软件能够帮助你快速构建还原度高且信息架构清晰明了的原型图,还能极大减低工作中与同事的沟通成本,更高效地推进工作。那么,一款好...

用局域网内部分享Axure原型,这里有详细的步骤

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。用axure做好原型,想分享给别人,有几个方法:生成本地文件,发送本地文件,但是文件有更新,就要重新发送用axure自...

Axure制作App原型应该怎样设置尺寸?原型尺寸对照表!

最近有几位小伙伴儿都提出同样一个疑问:想用Axure设计一个APP原型放到真实的移动设备中演示,但不知道应该使用什么尺寸?若要解释清楚像素和分辨率需要的篇幅比较长,请大家参考百度百科。这里老枪搜集...

200套数据可视化大屏模版Axure高保真原型

超炫可视化大屏模版来了,Axure高保真原型。关注微信公众号“素材帮帮站”,发送消息100051,获取素材下载地址。查看往期文章,获取更多免费素材。

Axure RP 8 Beta版正式上线(axure rp8是什么软件)

AxureSoftwareSolution公司于美国当地时间8月12日宣布其旗下产品AxureRP的v8版本的测试版正式上线。以下是其官方博客关于对AxureRP8Beta版的介绍:今天,...

PM小技术:使用SAE发布在线Axure文档

俗话说,不会写代码的产品经理不是好的射鸡湿。关于产品经理与技术之间的微妙关系,扯开了讲可是长篇大论,比如知乎上这个问题:IT行业产品经理(尤其是创业的)需要懂技术吗?懂到什么程度?,以及这个:产品经...

『原型资源』Axure自带图标库不够用,第三方经典图标库来袭

今天小编为大家带来第三方经典图标库,己确认内容可用现推荐给大家。直接上手就可不用自己画哈~获取原型文档请与班主任联系!先睹为快,合适再拿走不谢:图标太多,截取部分给大家参考o(* ̄︶ ̄*)o免费领取资...

Axure RP 8 测试版:将于今年夏天到来

我们一直在努力的开发AxureRP8。我认为这是对现有客户以及刚接触Axure的人的一个重要版本。我们希望看到你使用这些新特性,所以我们对现有客户免费升级。所有有AxureRP授权的客户包括标准...