您当前的位置:首页 > 计算机 > 编程开发 > Python

Python爬虫之反爬机制总结

时间:10-20来源:作者:点击数:

反爬机制总结

User-Agent和ajax

UA和ajax

数据懒加载

懒加载

cookie,代理,验证码

cookie,代理,验证码

滑动验证码

滑动验证码

简单文本图片化

在我们爬取数据时,可能遇见想要获取数字,但是网站数字是以图片的形式展现的,所以我们要使用一些方法进行图片识别,在之前我们提及用超级鹰来识别图片,这里我们再来介绍几种方式对于这种较为明显的图片进行识别,当然对于一些图片可以进行二值化处理后进行识别。

pytesseract库

例如识别这样的图片数据:

在这里插入图片描述

要得到173 0384 3736结果

# 需要的两个库:
from PIL import Image
import pytesseract

# 将图片以二进制形式储存在img变量中
# 由于图片是本地图片所以使用open方式读取数据
# "phone_number.jpg"是上图路径
# 在使用爬虫我们通常是这样的:
# img = requests.get("图片的url").content
img=open("phone_number.jpg",mode="rb").read()

# 使用io.BytesIO方式打开图片字节流,得到图片对象
img_data = Image.open(io.BytesIO(img))
# 也可以直接img_data = Image.open(r"phone_number.jpg")

# pytesseract.image_to_string将从图片对象的img_data中识别并转化为字符串
res = pytesseract.image_to_string(img_data)
print(res) # 输出:173 0384 3736

当然对于PIL比较容易安装,但是对于pytesseract不简单,使用时可能会报错:

pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH. See README file for more information.

那么如何解决呢?

戳它!!!

tesseract.exe下载地址

tesseract.exe安装方法

于是对于之前提到的古诗文网验证码识别就有了新方法

为了提高识别率我们进行图片二极化处理

这里是图片格式为png的代码:

import cv2
from PIL import Image
import pytesseract

# 为了方便使用,给大家分装成了函数
def ver_code(img_path):
	img = cv2.imread(img_path, 0)
	ret, new_image = cv2.threshold(img, 120, 220,cv2.THRESH_BINARY)
	cv2.imwrite("./pic.png", new_image)
	res = pytesseract.image_to_string(Image.open('pic.png'))
	return res

ver_code('phone_number.jpg')
# 传入验证码地址,返回结果为识别的字符串

实例:

在这里插入图片描述

收到小伙伴反馈,现在图片改成了gif

能难到我们吗?

首先导入库pillow

import cv2
from PIL import Image
import pytesseract


# 为了方便使用,给大家分装成了函数
def ver_code(img_path):
    im = Image.open(img_path)
    pngDir = img_path[:-4]+'.png'
    try:
        im.save(pngDir)
    except EOFError:
            pass
    img = cv2.imread(pngDir, 0)
    ret, new_image = cv2.threshold(img, 120, 220, cv2.THRESH_BINARY)
    cv2.imwrite(pngDir, new_image)
    res = pytesseract.image_to_string(Image.open(pngDir))
    return res


ver_code('图片名.gif')
# 返回字符串
在这里插入图片描述
ddddocr库

另外还有一个比较简单的库ddddocr:返回的就是验证码的字符串

import ddddocr
fp = open("图片地址","rb")
img_bytes = fp.read()
fp.close()
res = ddddocr.DdddOcr().classification(img_bytes)
print(res)
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门