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

下面是详细的攻略:

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日

相关文章

  • C语言 动态分配数组案例详解

    C语言动态分配数组案例详解 什么是动态分配数组 在C语言中,数组是一种非常基础的数据类型,它可以容纳一组相同类型的数据,而且数组的长度是静态的,也就是在声明时就要确定数组的长度。比如: int arr[10]; //声明了一个长度为10的整型数组 但是,在很多情况下,我们并不知道数组要存储多少个元素,或者存储元素数量会发生变化。此时,就需要采用动态分配数组的…

    人工智能概览 2023年5月25日
    00
  • 我的快递一个月没动静于是赶紧上线python快递查询系统

    下面我会详细讲解“我的快递一个月没动静于是赶紧上线python快递查询系统”的完整攻略。 攻略步骤 首先,需要了解一下快递公司的api接口。大部分快递公司都提供了开放接口,需要注册账号获取access_key,然后通过接口查询快递信息。 然后,需要编写python程序,通过api接口获取快递信息。这里我们可以使用requests库进行网络请求,获取json格…

    人工智能概论 2023年5月25日
    00
  • django 使用内置messages的操作

    下面是详细的“Django 使用内置 messages 的操作”的攻略: 什么是 Django messages Django 的 messages 应用就是用来在应用程序的不同部分之间传递一些短消息,以便完成一些非持久化的任务,比如:将一个未认证用户重定向到登录页面、在表单提交后显示成功的消息、显示错误的消息等等。 如何在 Django 中使用 messa…

    人工智能概论 2023年5月25日
    00
  • Nginx泛解析到子目录后自动判断有无public目录详解

    确认Nginx版本并修改配置文件 首先,需要确认Nginx的版本是否符合要求,因为旧版本可能不支持该功能。如果Nginx版本>=1.13.9,则可以在配置文件中添加以下指令: server{ … location / { # rewrite to public if exists if (-d $request_filename/public) {…

    人工智能概览 2023年5月25日
    00
  • Redis实现分布式锁详解

    Redis实现分布式锁详解 在分布式系统中,为了避免多个节点对同一资源进行操作产生冲突,常常会使用分布式锁。Redis是一个持久化的内存数据库,其提供了分布式锁的实现方案。 Redis分布式锁原理 Redis分布式锁的原理基于Redis的单线程特性和setnx(SET if Not eXists)命令的原子性操作。 当多个线程同时请求锁时,只有一个线程能成功…

    人工智能概览 2023年5月25日
    00
  • Django自定义用户认证示例详解

    Django自定义用户认证示例详解 Django提供了默认的用户认证系统,但有时我们需要根据自己的需求进行自定义。下面是一个完整的Django自定义用户认证的攻略。 使用Django内置的auth模块进行用户认证 首先我们来回顾一下Django内置的用户认证系统。在settings.py中配置’django.contrib.auth’后,我们可以使用内置的U…

    人工智能概览 2023年5月25日
    00
  • Django与AJAX实现网页动态数据显示的示例代码

    下面是“Django与AJAX实现网页动态数据显示的示例代码”的完整攻略。 1. 确定需求 首先,需要明确需要实现的功能。这个示例是要实现网页动态数据显示,即通过AJAX请求后台数据,把数据动态地展示在前端页面上。 2. 搭建Django开发环境 搭建Django开发环境的过程不在本攻略的讨论范围内,所以这里假设读者已经完成了Django环境的搭建。 3. …

    人工智能概论 2023年5月25日
    00
  • SpringBoot生产环境和测试环境配置分离的教程详解

    SpringBoot生产环境和测试环境配置分离的教程详解 为什么需要分离配置文件 在使用SpringBoot进行开发的时候,通常会有两个不同的环境:测试环境和生产环境。这两个环境有各自的配置,比如数据库连接、日志级别等。这些配置不应该和程序的代码混杂在一起,而应该分开存储。 分离配置文件的好处在于,可以在不影响代码的情况下,快速切换环境配置。此外,在部署程序…

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