awesome-python-login-model 测试报告解读:Bilibili 极验滑块、web 微信二维码与多站点登录方案实测验证
awesome-python-login-model 测试报告解读:Bilibili 极验滑块、web 微信二维码与多站点登录方案实测验证
导读
本篇文章以 README-Test.md 为核心骨架,逐项拆解该文档记录的 Bilibili 自动登录(含极验滑块处理)、web 微信二维码登录、图虫 Spider、Github 模拟登录、链家 Spider、新浪微博 Ajax 爬虫、网易云音乐下载、知乎登录及 execjs 报错、糗事百科协程爬虫、百度翻译 等实测结论与踩坑记录,并结合 bilibili/bilibili.py、webWeixin/webWeixin.py、Github/login.py、qsbk/qiushibaike.py、baidu_translate/Baidufanyi.py、sina/sina.py 等源码做纵深印证,还原其内部工作原理与调用链。读完你将获得一份可复用的多站点模拟登录选型清单与排错手册。
Bilibili 自动登录测试:成功率达 98%,核心是极验滑块破解
README-Test.md 首先给出结论:Bilibili 自动登录测试正常,成功率 98%。这是文档中最具代表性的案例,因为它不是简单的账号密码提交,而是完整实现了 极验(Geetest)滑块验证码 的自动化通过流程。
- 文档配图:bilibili.gif 与 bilibili.jpg 展示了登录现场与运行结果。
- 源码骨架:登录入口为
passport.bilibili.com/login,在BiliBili类中串接了 输账号 → 找滑块 → 截取两张验证码 → 计算缺口 → 生成模拟轨迹 → 拖动滑块 的完整链路,见 crack()。
登录链路与滑动验证码自动化原理
从 bilibili.py 的源码可以还原出这套"两次截图 + 像素比对"的思路:
- 准备浏览器:通过
ChromeOptions开启excludeSwitches: <a href="https://link.gitcode.com/i/841395cd6a23dd25290961bef4ae401b" target="_blank">'enable-automation']开发者模式,降低被识别为自动化工具的概率,见 [init。 - 悬停与按下滑块分别截图:
get_screenshot先move_to_element(button)获取未按下的完整验证码图,再click_and_hold(button)获取按下后显示缺口的验证码图,两张图均以 PNG 保存(get_screenshot)。 - 裁剪出验证码区域:
get_position通过.gt_box定位验证码元素,取其location与size计算top/bottom/left/right裁剪坐标(get_position)。 - 像素比对找缺口:
is_pixel_equal对两张图逐像素比较 RGB,threshold = 100以内视为相同;get_gap从left = 60起向右扫描,找到第一列像素差异处即为缺口左侧 x 坐标(get_gap)。 - 模拟人类拖动轨迹:
get_track采用 分段变速 算法——前 2/3 以a = random.randint(1, 3)加速,后 1/3 以a = -random.randint(3, 5)减速,并先让滑块多划出 10 像素再回退补-random.randint(2, 4)的抖动步(get_track)。这一步模拟"先过头再回正"的真实手感,是提高通过率的关键。 - 失败重试:
crack()中最多重试 3 次,以.gt_info_type是否出现验证通过:文案判断成功(crack)。
⚠️ 源码注释明确提醒:电脑缩放比例需为 100%,否则验证码图片坐标获取会出问题(bilibili.py)。这是复现时最容易踩的坑。
web 微信:二维码扫码登录与好友列表获取
文档对 web 微信没有给出文字说明,仅以 weixin.gif 与 weixin.jpg 两张图展示运行效果。实际上该项目实现了"扫码 → 轮询确认 → 初始化会话 → 拉取通讯录"的完整流程,对应源码为 webWeixin/webWeixin.py(264 行)。
核心链路在 main() 中串接(main):
- getUUID():GET
login.weixin.qq.com/jslogin,从返回的window.QRLogin.code = 200; window.QRLogin.uuid = "..."中正则提取uuid(getUUID)。 - showQRImage():GET
login.weixin.qq.com/qrcode/{uuid}下载二维码图片,并按平台差异调用open/xdg-open/os.startfile打开展示(showQRImage)。 - waitForLogin():轮询
login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip=...&uuid=...,解析window.code——201表示已扫码待确认、200表示已登录、408表示超时(waitForLogin)。 - login():访问 redirect_uri,用
xml.dom.minidom解析返回的 XML,取出skey / wxsid / wxuin / pass_ticket四个凭证,组装成BaseRequest(login)。 - webwxinit() + webwxgetcontact():初始化会话并获取通讯录,随后按
VerifyFlag & 8(公众号/服务号)、SpecialUsers列表、@@群聊前缀、自己的UserName四类规则过滤好友,最终打印每位好友的昵称、性别、备注与签名(webwxgetcontact)。
这一段非常适合理解"二维码登录 + 轮询状态机 + 会话凭证复用"这一被大量站点采用的通用登录范式。
图虫 Spider:关键词搜索批量下载图片
文档的"图虫 Spider"章节仅以两张动图呈现下载过程,无文字说明。对应实现为 tuchong/tuchong.py,是一条"搜索词 → imageId → 图片 URL → 本地保存"的流水线:
get_imageID(term, page)请求stock.tuchong.com/api/free/search/?term=...&page=...,解析 JSON 中的data.hits得到图片imageId(get_imageID)。get_ImageJPG(id)拼接stock.tuchong.com/free/image/?imageId=...页面,正则抓取class="image-cover"内的src(get_ImageJPG)。download_image补全https:前缀下载图片,save_image以 内容 MD5 作为文件名 去重保存(save_image)。
main() 中默认循环抓取前 6 页,运行方式为:
python3 tuchong/tuchong.py
# 输入想要搜索的内容: 风景
淘宝 web:模拟登录与爬虫的分工
文档"淘宝 web"仅有一句关键分工说明:taobao.py 为模拟登录,剩下的文件为爬虫。当前仓库中 taobao 目录对应实现为:
- taobao_via_username_password.py:基于 selenium 的账号密码登录,先点击切换到账号密码登录 Tab,依次定位
TPL_username_1/TPL_password_1输入框与J_SubmitStatic登录按钮,最后抓取用户名标签验证登录成功(login)。 - taobao_via_weibo.py:微博授权渠道登录。
源码头部注释给出了一个重要的工程化技巧:直接使用 chromedriver 会被淘宝识别为"机器人",需要通过
perl -pi -e 's/cdc_/dog_/g' /usr/local/bin/chromedriver
全局替换 chromedriver 二进制中的 cdc_ 标识为 dog_,以规避反自动化检测(taobao_via_username_password.py)。仓库还附带了已修改的 mac_chromedriver/chromedriver 与 windows_driver/chromedriver.exe,以及"不加载图片加速访问 + 开发者模式"的 ChromeOptions 配置。
文档后续代码块补充了这套爬虫的整体数据方案:
1. 爬取淘宝各子标签,按销量排名商品信息,按分类保存至MongoDB
2. 通过pandas进行数据分析
3. 将商品在各省分布、销量排行、地图分布等通过matplotlib绘图显示
即 selenium 登录 → Cookie/会话 → 爬虫采集 → MongoDB 存储 → pandas 分析 → matplotlib 可视化 的完整数据管道。
Github 模拟登录:requests 会话 + authenticity_token 逆向
文档"Github"配图 github.jpg 展示了登录成功的用户名输出。该案例代表"纯 requests 直登"的另一条技术路线(不依赖浏览器),对应实现为 Github/login.py:
- 先 GET 拿 token:
get_token()访问github.com/login,正则抓取name="authenticity_token" value="(.*?)"(get_token)。这是 Rails 应用的 CSRF 防护机制,模拟登录必须带上。 - 再 POST 提交会话:
login_GitHub()向github.com/session提交commit / utf8 / authenticity_token / login / password,通过requests.Session()保持 Cookie(login_GitHub)。 - 校验结果:从响应页正则
"user-login" content="(.*?)"提取用户名,验证登录是否成功。
该示例说明:凡是采用表单 CSRF Token 的站点,都必须先解析页面 token 再随登录表单回传,这是 requests 直登的关键一步。
链家 Spider:新增数据采集项目
文档"新增链家 Spider"配图 lianjia.gif,同样未附文字说明。README 传送门中将其归为爬虫类新增项目,模式与淘宝爬虫一致——模拟登录获取会话后,用 requests/scrapy 做大规模采集。在仓库中可找到配套的 liepin 系列 scrapy 工程(含 pipelines/middlewares/settings 完整工程骨架)作为同类参考。注意:文档未给出链家 Spider 的具体爬取字段与运行参数,仓库中也未见对应源码,故无法对其细节作更多描述,仅确认其为该仓库新增的爬虫采集项目。
guoke.spider:下载过快,谨慎使用
文档给出唯一一句警告:
guoke.spider 使用需谨慎,下载的比较快!10 秒能下载一堆,截图我就不展示了,已经删除,东西太多了 😝
结合 guoke/guoke_spider.py 与 guoke/guoke.py 的存在,可以推断该爬虫下载速度极快(文档称 10 秒可下载大量数据),因此被作者主动移除了演示截图。实操上建议控制并发与频率、限速运行,避免对目标站点造成过大压力。具体下载量与吞吐数据文档未给出,不宜夸大。
微博:模拟登录 + Ajax 微博爬虫
文档"微博"明确给出分工:
- sina.py 为模拟登录
- spider 文件夹中为爬虫
对应源码为 sina/sina.py,其登录方式是手机号 + 密码的接口直登:用 sign = new_time + '_' + md5(phone + pwd + new_time) 生成签名,POST 至 appblog.sina.com.cn/api/passport/v3_1/login.php,携带 appkey / appver / pin 等固定参数(get_login),并强调使用 getpass 隐藏密码输入。
爬虫部分文档给出运行说明:
1. 输入要爬取的博主ID,获取ajax请求
2. 解析json数据,爬取博主所有微博,保存至MySQL
即 sina/spider/Ajax_weibo.py 的职责:输入博主 ID → 模拟 Ajax 请求 → 解析 JSON → 落库 MySQL。
网易云音乐:下载 Demo 与 Crypto 依赖的坑
文档"网易云音乐"是典型的踩坑记录:
新增网易云音乐下载,之前的一个小 demo 应该还可以用,Crypto 包应该挺难搞的,安装之后还是导入不了,推荐去百度一下。
对应源码为 NeteaseCloudMusicDownload/api.py。这条记录的实操价值在于:
- 网易云音乐的接口涉及 AES 加密参数,代码依赖
Crypto(PyCrypto / pycryptodome)库; - 安装后仍
import失败的常见原因是包名与导入名不一致(旧版 PyCrypto 安装包名为Crypto,新版 pycryptodome 也使用Crypto,但若通过其他途径安装可能引入命名冲突或版本不兼容),建议按官方文档卸载重装对应发行版,并核对 Python 版本匹配; - 文档作者未在此给出完整排错步骤,属于"问题指引式"记录,具体安装方式以你所用包管理器的实际提示为准。
知乎:登录正常,但 execjs 报错有明确解决方案
文档"知乎"包含两个可执行结论:
- 知乎登录没有问题,不过要手动输入验证码——即模拟登录本身可用,验证码环节需人工介入。
- 常见报错:
execjs._exceptions.ProgramError: TypeError: 'exports' 未定义。
文档给出的原因与解决办法:
1. 由于是你本地的JScript引擎只有一个默认的JScript,所以会造成json未定义的错误。
2. execjs会自动使用当前电脑上的运行时环境
3. 解决办法:安装一个nodejs的V8引擎就可以了
技术原理:PyExecJS 只是一个桥接库,它会把 JS 代码交给本机已有的运行时执行。Windows 上默认的 JScript(IE 引擎)对 exports / module.exports 这类 CommonJS 语法支持不完整,导致 json 未定义 之类的异常。安装 Node.js 后,PyExecJS 会自动优先选用 V8 引擎,问题随之消失。该经验同样适用于本仓库其他依赖 JS 逆向的项目(例如 baidu_translate/translate.js、qqmusic/sign.js)。
配图 zhihu.jpg 展示了知乎登录的现场。
糗事百科:改为协程版爬虫
文档"糗事百科"配图 qiushibaike.gif 与 qiushibaike.jpg,并标注 "改为协程版"。对应实现为 qsbk/qiushibaike.py:
- 使用
gevent.monkey.patch_all()+gevent.pool.Pool(5)构建 5 并发协程池; - 用
queue.Queue存放分页 URL,get_url_list()按8hr/page/{page}模板生成任务; exec_task中requests.get获取 HTML →lxml.etree解析//a<a href="https://link.gitcode.com/i/59e72d134a07ab0d0271d451e37bdb53" target="_blank">@class="recmd-content"]/text()提取段子标题 → 打印落盘,见 [exec_task;- 通过
pool.apply_async(self.exec_task, callback=self.exec_task_finished)实现任务完成后的自动补位。
这是理解 gevent 协程 + 队列 + 回调续接 三个配合点的最小可运行示例。
百度翻译:JS 逆向生成 sign 参数的接口直登
文档"百度翻译"仅一句"输入英语自动翻译",配图 baidu_translate.gif。对应实现为 baidu_translate/Baidufanyi.py,是纯 requests + JS 逆向的典型代表:
- 目标接口
fanyi.baidu.com/basetrans,POST 参数为query / from / to / token / sign(源码注释给出了完整分析,见 Baidufanyi.py)。 make_sign()用js2py.EvalJs()读取并执行 translate.js,调用其中的函数context.a(self.query)生成sign(make_sign)。make_data(sign)按translating_mode(0=英译中、1=中译英)决定from/to,拼出请求体(make_data)。get_content从响应json()<a href="https://link.gitcode.com/i/0b7136be3b1a502d3651505094356098" target="_blank">"trans"][0]["dst"]提取译文并打印([get_content)。
运行方式:
python3 baidu_translate/Baidufanyi.py
# 请输入翻译模式(0:英译中 1:中译英): 0
# 请输入您要翻译的内容: hello
全项目测试结论汇总
| 站点/模块 | 测试结论(来自 README-Test.md) | 实现路线(仓库源码) |
|---|---|---|
| Bilibili | 自动登录正常,成功率 98% | selenium + 极验滑块像素比对(bilibili/bilibili.py) |
| web 微信 | 扫码登录 + 好友列表 | requests 二维码轮询状态机(webWeixin/webWeixin.py) |
| 图虫 Spider | 关键词批量下载图片 | requests 搜索 + 正则解析(tuchong/tuchong.py) |
| 淘宝 web | taobao.py 模拟登录,其余为爬虫 | selenium 登录 + MongoDB/pandas/matplotlib 管道 |
| Github | 模拟登录成功 | requests + authenticity_token(Github/login.py) |
| 链家 Spider | 新增爬虫项目 | 同淘宝爬虫思路 |
| guoke.spider | 下载过快,谨慎使用 | guoke/guoke_spider.py |
| 微博 | sina.py 模拟登录,spider 为爬虫 | 接口直登 + Ajax 爬虫落 MySQL(sina/sina.py) |
| 网易云音乐 | 下载 Demo,Crypto 导入有坑 | NeteaseCloudMusicDownload/api.py |
| 知乎 | 登录正常,需手动验证码 | 验证码人工介入 |
| 糗事百科 | 协程版爬虫 | gevent 协程池(qsbk/qiushibaike.py) |
| 百度翻译 | 英译中自动翻译 | requests + js2py 逆向 sign(baidu_translate/Baidufanyi.py) |
通用技术选型建议(依据 README.md 的项目说明):
- 优先用 selenium 的场景:直接登录难度大的站点,如 Bilibili(滑块)、QQ 空间等;
- 优先用 requests 直登的场景:接口逻辑清晰、仅需逆向签名/Token 的站点,如 Github、百度翻译、微博;
- 效率最佳实践:登录阶段用 selenium 拿 Cookie,之后维护 Cookie 交给 requests/scrapy 做数据采集,在登录成功率与采集速度之间取得平衡。
运行前置条件:仓库所有程序均使用 Python 3 编写(见 README.md);selenium 方案需自行准备与浏览器版本匹配的 WebDriver,如仓库提供的 taobao/mac_chromedriver/chromedriver 与 taobao/windows_driver/chromedriver.exe。由于各站点登录策略会持续变化,文档中"测试正常/成功率 98%"等结论均以记录时点为前提,代码可能因网站改版而失效,建议按需调试。