【Day 28】- 这个验证码有点难破解(应对反爬虫技术-验证码篇)

前情提要

昨天使用了 Dcard 的 API 来爬取 Dcard 上面的文章。

开始之前

各位开始在撰写爬虫後,常常会遇到一些网站刻意的挡掉爬虫,这种挡掉爬虫的设计称为反爬虫技术。

最常见的反爬虫技术莫过於验证码了。我反爬虫会分两篇来讨论,今天这篇会专注於验证码的部分。

验证码

验证码英文称为 Captcha,是一种区分用户是机器或人类的公共全自动程序。

常见的有

以及 Google 发行的 reCAPTCHA

可能有些读者会发现 Google 发行的 reCAPTCHA 有时候会需要二次验证,有时候不用。事实上,如果演算法检测到当前系统存在风险,比如可能是陌生的网路环境,可能是模拟程序,就会须要二次验证。

应对

要应对验证码有几个方法,以下列出。

  • 人工输入验证码

  • 模拟人类动作(reCAPTCHA )

  • OCR 辨识验证码

  • 第三方平台验证码辨识服务

  • User Session

  • 人工输入验证码

此应对方法十分直观,就是当遇到需要验证码的地方时,就用类似 input() 的步骤将其停住,把图片载下来,人工输入验证码,之後继续爬取。

  • 模拟人类动作(reCAPTCHA)

这个应对方法常用於 Selenium 爬取时遇到 reCAPTCHA ,往往会需要这种会渲染网页 JavaScript 或在网页停留、卷动一段时间,而後点击 I'm not a robot 。

  • OCR 辨识验证码

此应对方法主要是将验证码的图片使用 OCR 文字辨识。

Python 常用的 OCR 为 pytesseract。

pipenv install pillow
pipenv install pytesseract

pytesseract 需要下载Tesseract执行档,各位要记得安装路径,等等在 Python 程序中需要指定该路径。

载点 : https://github.com/UB-Mannheim/tesseract/wiki

from PIL import Image
import pytesseract

if __name__ == '__main__':
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
    img = Image.open('img.png')
    text = pytesseract.image_to_string(img)
    print(text)
  • 第三方平台验证码辨识服务

有许多提供这类服务的平台,这边推荐 Anti-captcha,以量计费,如果需求不多,可以使用很久。

  • User Session

先使用浏览器先行登入,之後将 Session 汇出,使爬虫带上该 Session , 便可以达到不使用帐号密码登入的效果,自然就不需要面对验证码。

本次铁人赛有两篇文章用到此技巧。

【Day 11】- 还在 PTT 点击已满 18 岁? 带上 cookies 吧!(实战 PTT 爬虫 1/3)

【Day 21】- 你的爬虫还在用帐号密码进行登入? 带上 Session 吧!(实战 Selenium 自动点击 Instagram 好友贴文赞 1/2)

结语

本次列举了验证码这个反爬虫技术的应对方法,善用这些方法,可以去回避掉一些网页的反爬虫,如果遇到了还是无法用以上方法应对的状况,可以考虑换个爬虫架构,或继续深入优化 OCR 或者一些资安方面绕过手法。

明日内容

明天会带各位看一下常见的反爬虫技术。

补充资料

Python 进阶爬虫技巧- Selenium + Anti-captcha 图片验证码破解 : https://medium.com/@keigi1203/python-进阶爬虫技巧-selenium-anti-captcha-图片验证码破解-b9486df79aa7


<<:  Day28 Gin with SMTP Server

>>:  Day 28. 解掉bug了

Day16 X Polyfill-less Bundling Script & File Compression

今天是 Build Optimizations 主题的最後一篇了,到目前为止我们已经认识了 Cod...

DAY8: process.nextTick( )

今天的介绍的也是属於Node的基础。 process.nextTick 依照Node官网的解说,事实...

[Day 13] 资料产品生命周期管理-加工资料(二)

接续上篇 介绍一下一般开发 ETL 的流程。每只 ETL 都可以看作是独立的程序,有独立的开发流程。...

[NestJS 带你飞!] DAY27 - Swagger (下)

API 操作设计 上一篇我们让 API 的参数能够顺利显示在 Swagger UI 中,在设计完参数...

Vue.js 从零开始:SSR、MPA、SPA的概念

每次网路搜寻关键字SSR、MPA、SPA,都会有看没有懂的感觉,看完过没多久马上就忘了,藉由这次机会...