V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Alberte
V2EX  ›  程序员

爬虫遇到验证码问题

  •  
  •   Alberte · 2019-05-31 20:46:48 +08:00 · 2335 次点击
    这是一个创建于 2021 天前的主题,其中的信息可能已经有所发展或是发生改变。

    模拟登陆一个网站,有验证码,我的解决方案是:

    1. 使用 selenium + PIL + pytesseract
    2. 使用 selenium 先将网站保存为一个图片 allScreen.png
    3. 使用 selenium 里的 location 和 size 获得验证码标签 的位置
    4. 使用 PIL 里 image 包进行截取验证码,并保存下来
    5. 使用 pytesseract 进行识别验证码以获取验证码
    6. 最后再使用 selenium 进行模拟登陆

    但是在进行到第 4 步时,发现在第 3 步的得到位置无法进行正确从 allScreen.png 中截取到验证码,就一直卡在这里,我在网上看的教程或者博客好像都是在 Windows 上能够正确截取验证码,但是在 macOS 上就不行,我查了好多方法,都是在 Windows 下的解决方案,比如:调整系统分辨率为 100%,但是 macOS 上好像没法调系统分辨率。

    此外,我也尝试了在第 2 步时,将 selenium 模拟设置为全屏,即 driver.maximize_window() , 也是无法解决。

    想问有没有能在 macOS 下能正确找到验证码或者目标位置的方法,也就是第 3 步和第 4 步

    谢谢大家~

    9 条回复    2019-06-05 10:46:48 +08:00
    exip
        1
    exip  
       2019-05-31 21:05:28 +08:00 via Android
    我的解决办法是在新标签页中打开验证码,然后截图,再用 PIL 裁剪到合适大小,最后识别。
    在 windows 和 linux 下都能用,macOS 没试过。
    其实也可直接接把验证码下载下来识别,不过 selenium 下载文件有点麻烦。
    wangsongyan
        2
    wangsongyan  
       2019-05-31 21:14:23 +08:00 via iPhone
    出个主意,selenium 打开页面后,用代码拿到 cookie 直接去请求图片
    Takamine
        3
    Takamine  
       2019-05-31 21:36:17 +08:00
    试试 pyppeteer 看看。
    ClericPy
        4
    ClericPy  
       2019-06-01 10:41:22 +08:00
    cdp 用的好的话, 直接拿到图片二进制数据, 解码出来去识别就行了吧, 又截图又切图的不费劲么... 甚至上面说的也没毛病, 拿到同样的请求(对 cdp 来说拿到请求体其实就能拿到流量了, 不该多此一举), 包括 cookie 什么的, 再次请求拿到的图片是同一个, 二次请求也可以
    简单地说, 就是 chrome devtools protocol 了解一下, 开调试模式, 挂 websocket 截流量, 识别图片的验证码, 然后注入 js 来填写

    不建议非测试工程师走 selenium, 个人意见...
    目前的 cdp 的 Python 轮子因为不像 nodejs 那么适配 chrome 里的以事件导向的异步, 没有太多好轮子, pyppeteer 的协程差不多能实现, 不过我用的时候死在下载 chronium 上了... 就自己造了个简单同步的轮子(就是 block 主线程去等事件...)
    kingfalse
        5
    kingfalse  
       2019-06-01 10:44:37 +08:00 via Android
    二楼说的对
    Alberte
        6
    Alberte  
    OP
       2019-06-05 10:14:17 +08:00
    @exip selenium 下载文件是挺麻烦的😤
    @wangsongyan 尝试了下你的方法,在 selenium 下不太行。不过,最后使用 Requests 的 Session() 方法保持同一个会话,并拿到 cookie 请求图片,可以解决问题。
    @Takamine 👌
    @ClericPy 🙃还在研究你的方法,
    wangsongyan
        7
    wangsongyan  
       2019-06-05 10:28:51 +08:00
    如果不行就是你姿势不对,因为这个思路我是试过可以的。
    Alberte
        8
    Alberte  
    OP
       2019-06-05 10:42:05 +08:00
    @wangsongyan 有两个问题,问题一、通过打开目标页面链接,可以获取一个 cookie,通过验证码图片链接,也可以获得一个 cookie,你说的用第 1 个 cookie 去请求还是第 2 个 cookie 去请求?问题二、请求获得的图片,该怎样保存下来呢? 我使用 selenium 的 driver.get(url=imgUrl....) 方法,无法像 request.get(url=imgUrl).content,可以获取图片并保存到本地....
    大佬求解答🙏
    wangsongyan
        9
    wangsongyan  
       2019-06-05 10:46:48 +08:00 via iPhone
    等你的页面加载完,通过 selenium 拿到 cookie,具体不用管到底是哪个 cookie,后续就可以脱离 selenium 了,可以用 request 去请求图片、识别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4185 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:35 · PVG 13:35 · LAX 21:35 · JFK 00:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.