Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

yizhihongxing

下面是详细的攻略:

Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

一、前言

爬虫在获取数据上有着很大的优势,但存在着一些限制,比如在网站登录时需要验证码,而这些验证码又必须由人工来识别,无法通过普通的XPath或CSS Selector来定位。

本文主要介绍如何使用Selenium和Tesseract-OCR结合的方式,来实现自动识别验证码,并使用爬虫来获取网页数据的方法。

二、实践步骤

1. 安装Selenium和Tesseract-OCR

首先,我们需要安装Selenium和Tesseract-OCR。

Selenium可以在Python中使用pip安装:

pip install selenium

Tesseract-OCR需要下载安装,可以从官网(https://github.com/tesseract-ocr/tesseract)中下载(安装时需要添加到环境变量中)。

2. 导入需要的库

我们需要导入相关的库,包括Selenium、time和pytesseract:

from selenium import webdriver
import time
import pytesseract

其中,pytesseract用于对验证码图像进行识别。

3. 启动浏览器

使用Selenium启动要爬取的网站,在需要输入验证码的页面停止:

url = 'http://example.com'
browser = webdriver.Chrome()
browser.get(url)

# 在需要输入验证码的页面停止,等待输入验证码
time.sleep(5)

这里使用的是Chrome浏览器,也可以使用其他浏览器。

4. 定位验证码图片并截取

定位图片通常是使用XPath或CSS Selector,但是验证码图片有可能会在网页代码中被隐藏,所以我们需要执行JavaScript代码来获取验证码图片的位置。

以下是通过JavaScript获取验证码图片的位置的代码:

js = 'var canvas = document.getElementById("captcha");'
     'var img = canvas.toDataURL("image/png").replace(/^data:image\/(png|jpg);base64,/, "");'
     'return img'
img_base64 = browser.execute_script(js)

获取到图片后,需要将其保存为图片文件。这里我们可以使用Pillow库中的Image对象来进行图片操作。

from PIL import Image
import base64

img_bin = base64.b64decode(img_base64)
img = Image.open(io.BytesIO(img_bin))
img.save("captcha.png")

这里将获取到的base64编码的验证码图片解码后,保存为captcha.png文件。

5. 使用Tesseract-OCR识别验证码

在存储了验证码文件后,需要使用Tesseract-OCR对其进行识别。

captcha = pytesseract.image_to_string(Image.open("captcha.png"))

6. 在网页中输入验证码并提交

使用Selenium的方式,将验证码输入并提交:

# 输入验证码
browser.find_element_by_name("captcha").send_keys(captcha)

# 提交表单
browser.find_element_by_xpath("//button[text()='提交']").click()

7. 爬取数据

已经通过验证码,登录到了需要访问的页面,接下来我们可以使用Selenium来获取数据,比如通过XPath获取有用的标签数据,并将其保存为文本文件:

# 获取数据
data_eles = browser.find_elements_by_xpath("//div[@class='data']")
data = [d.text for d in data_eles]

# 将数据保存到文本文件中
with open("data.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(data))

这里我们获取了class为data的div标签中的数据,保存到了data.txt文件中。

三、实例

以下是一个基于以上攻略的实例,用于爬取某个科技论坛的数据。

实例1:爬取科技论坛数据

from selenium import webdriver
import time
import pytesseract
from PIL import Image
import io
import base64

url = 'http://example.com/login'
browser = webdriver.Chrome()
browser.get(url)

# 输入用户名和密码
browser.find_element_by_name("username").send_keys("your_username")
browser.find_element_by_name("password").send_keys("your_password")

# 等待验证码图片加载完成
time.sleep(3)

# 通过JavaScript获取验证码图片
js = 'var canvas = document.getElementById("captcha");'\
     'var img = canvas.toDataURL("image/png").replace(/^data:image\/(png|jpg);base64,/, "");'\
     'return img'
img_base64 = browser.execute_script(js)

# 保存验证码图片
img_bin = base64.b64decode(img_base64)
img = Image.open(io.BytesIO(img_bin))
img.save("captcha.png")

# 识别验证码
captcha = pytesseract.image_to_string(Image.open("captcha.png"))

# 输入验证码
browser.find_element_by_name("captcha").send_keys(captcha)

# 提交表单
browser.find_element_by_xpath("//button[text()='登录']").click()

# 登录后等待页面加载完毕
time.sleep(3)

# 获取数据
data_eles = browser.find_elements_by_xpath("//div[@class='data']")
data = [d.text for d in data_eles]

# 将数据保存到文本文件中
with open("data.txt", "w", encoding="utf-8") as f:
    f.write("\n".join(data))

# 关闭浏览器
browser.quit()

通过以上代码,即可成功爬取该科技论坛中的数据。

实例2:爬取其他需要验证码的网站数据

对于其他需要验证码的网站,只需要更新url、验证码输入框的name属性、提交按钮的XPath以及数据的XPath等参数即可。

# 更新url
url = 'http://otherwebsite.com/login'

...

# 更新验证码输入框的name属性
browser.find_element_by_name("captcha_code").send_keys(captcha)

# 更新提交按钮的XPath
browser.find_element_by_xpath("//button[text()='登录']").click()

...

# 更新数据的XPath
data_eles = browser.find_elements_by_xpath("//div[@class='data']")

四、总结

Selenium和Tesseract-OCR结合使用可以自动识别网站的验证码,实现爬虫自动化爬取数据。实践中需要针对每个网站的需要进行一定的参数调整和优化。

以上是使用Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python UIAutomator2使用超详细教程

    Python UIAutomator2使用超详细教程 一、UIAutomator2简介 UIAutomator2 是 Google 开发的用于 Android 应用程序 UI 测试的一个框架。它可以对 Android 设备上的应用程序进行自动化测试,而不需要根据应用内部实现编写任何测试代码。并且它是开源的,它使用 Java API 简化了逆向工程测试。 二、…

    人工智能概览 2023年5月25日
    00
  • python中的os.mkdir和os.makedirs的使用区别及如何查看某个模块中的某些字母开头的属性方法

    一、os.mkdir和os.makedirs的使用区别 os.mkdir和os.makedirs都是用来创建文件夹的函数,但是它们在处理复杂情况下存在使用区别。 os.mkdir(path[, mode]) 该函数用于创建单层目录(只能创建一级目录,不能创建多级目录),参数path为要创建的目录路径名,mode参数用来设置路径的权限,默认为0777。如果要创…

    人工智能概览 2023年5月25日
    00
  • springboot-mongodb的多数据源配置的方法步骤

    下面是详细讲解 “springboot-mongodb的多数据源配置的方法步骤” 的完整攻略,包含两个示例说明。 第一步:导入相关依赖 首先,在 pom.xml 文件中添加 Spring Boot 和 MongoDB 的依赖项。 <dependencies> <!–Spring Boot相关依赖–> <dependency&…

    人工智能概论 2023年5月25日
    00
  • C/C++程序开发中实现信息隐藏的三种类型

    C/C++程序开发中实现信息隐藏的三种类型: 利用访问控制符实现信息隐藏 C++中的访问控制符包括public、protected和private。其中,public表示成员变量或函数可以在类的内部和外部被访问,protected表示成员变量或函数只能在类的内部或子类中被访问,private表示成员变量或函数只能在类的内部被访问。 在设计C++程序时,通常将…

    人工智能概览 2023年5月25日
    00
  • opencv学习笔记C++绘制灰度直方图

    Opencv学习笔记C++绘制灰度直方图攻略 Opencv是一个常用的开源计算机视觉库,提供了一系列用于图像处理的工具和算法。在图像处理领域,灰度直方图是一种常用的工具,可以用来分析图像的颜色分布情况。本文将介绍如何使用Opencv库绘制图像的灰度直方图。 准备工作 在使用Opencv库绘制灰度直方图之前,需要先安装Opencv库和C++编译器。可以在官网下…

    人工智能概论 2023年5月24日
    00
  • 利用nginx与ffmpeg搭建流媒体服务器过程详解

    下面是一份利用nginx与ffmpeg搭建流媒体服务器的攻略。 准备工作 安装nginx와 ffmpeg 在开始操作之前,应该先安装两个核心软件:nginx和ffmpeg。 要安装nginx和ffmpeg,可以使用以下的命令: 在Linux上的命令行终端中: sudo apt-get update sudo apt-get install nginx ffm…

    人工智能概览 2023年5月25日
    00
  • django轻松使用富文本编辑器CKEditor的方法

    下面是整个攻略的完整步骤: 准备工作 安装django:在终端输入pip install django进行安装,并创建一个django项目。 下载CKEditor:在官网下载CKEditor,并解压到项目的静态文件目录。 安装django-ckeditor插件:在终端输入pip install django-ckeditor进行安装,并添加到django项目…

    人工智能概览 2023年5月25日
    00
  • 解决docker images 镜像消失的问题

    针对“解决docker images 镜像消失的问题”的完整攻略,以下是详细的步骤说明和示例: 1. 确认镜像是否存在 首先,我们需要确认镜像是否真的丢失了。可以通过docker images命令来查看本地镜像列表。如果镜像确实消失了,那么列表中是看不到这个镜像的。 示例1:检查本地是否存在mysql5.7镜像 $ docker images | grep …

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部