爬虫遇到验证码问题

2019-05-31 20:46:48 +08:00
 Alberte

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

  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 步

谢谢大家~

2326 次点击
所在节点    程序员
9 条回复
exip
2019-05-31 21:05:28 +08:00
我的解决办法是在新标签页中打开验证码,然后截图,再用 PIL 裁剪到合适大小,最后识别。
在 windows 和 linux 下都能用,macOS 没试过。
其实也可直接接把验证码下载下来识别,不过 selenium 下载文件有点麻烦。
wangsongyan
2019-05-31 21:14:23 +08:00
出个主意,selenium 打开页面后,用代码拿到 cookie 直接去请求图片
Takamine
2019-05-31 21:36:17 +08:00
试试 pyppeteer 看看。
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
2019-06-01 10:44:37 +08:00
二楼说的对
Alberte
2019-06-05 10:14:17 +08:00
@exip selenium 下载文件是挺麻烦的😤
@wangsongyan 尝试了下你的方法,在 selenium 下不太行。不过,最后使用 Requests 的 Session() 方法保持同一个会话,并拿到 cookie 请求图片,可以解决问题。
@Takamine 👌
@ClericPy 🙃还在研究你的方法,
wangsongyan
2019-06-05 10:28:51 +08:00
如果不行就是你姿势不对,因为这个思路我是试过可以的。
Alberte
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
2019-06-05 10:46:48 +08:00
等你的页面加载完,通过 selenium 拿到 cookie,具体不用管到底是哪个 cookie,后续就可以脱离 selenium 了,可以用 request 去请求图片、识别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/569580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX