图文混淆,验证码反爬(Steamboat练习)

本练习涉及:css语法、

IO、pytesseract、pillow和parsel库

目录

第一步

 第二步

第一部分的源代码

第二部分  图片验证码

第二部分源代码


练习网址:http://www.porters.vip/confusion/recruit.html

如图:

第一步

使用parsel库的css选择器,获取图片的网址

parsel是一个强大的数据解析库

里面有css,xpath以及re

常用的css语法

 第二步

请求、处理图片,识别成文字

需要用到pillow(原PIL库)和pytesseract库

安装方式: pip install pytesseract,pillow

注意!!!

安装是pillow,调用是import PIL

找不到tesseract语言包的下面拿:

 链接: https://pan.baidu.com/s/1B00tHLndwil7-gGWonKXhQ?pwd=ydii 提取码: ydii 

IO库的BytesIO方法读取图片二进制数据

配合PIL.Image方法打开图片

这样操作可以不用将图片保存本地,直接在内存中处理

最后使用pytesseract.image_to_string方法进行文字识别

输出结果

第一部分的源代码

from pytesseract.pytesseract import image_to_string
import requests
from parsel import Selector
from pytesseract import image_to_string
from PIL import Image
import io

url = "http://www.porters.vip/confusion/recruit.html"
res = requests.get(url)
sel = Selector(res.text)
img_ele = sel.css('img.pn::attr("src")').extract_first()
print(img_ele)

# 获取完整的网址
img_url = url.split("recruit.html")[0] + img_ele
# 获取图片的二进制数据
img_res = requests.get(img_url).content
# 使用IO库的BytesIO方法和PIL库的Image.open方法
# 直接在内存里处理图片数据
img_body = Image.open(io.BytesIO(img_res))
# 使用pytesseract的image_to_string
# 实现图片转文字
print(image_to_string(img_body).strip())

第二部分  图片验证码

中国知网:http://my.cnki.net/Register/

 如图,先提取验证码的网址,请求网址,

刷新几次发现,每次请求的验证码都不同

 通过PIL处理图片,先把图片黑白色处理(消除彩色),再进行二值化处理(消除干扰线)

效果

 补充一个计算型验证码:http://www.porters.vip/captcha/mathes.html

 多一步,正则re提取

 效果

第二部分源代码

from PIL import Image
from io import BytesIO
import pytesseract,requests
from parsel import Selector

base_url = "http://my.cnki.net/Register/"
base_res = requests.get(base_url)
src = Selector(base_res.text).css('#checkcode::attr("src")').extract_first()
img_url = base_url + src
img_res = requests.get(img_url)

# 把图片黑白处理
image = Image.open(BytesIO(img_res.content)).convert('L')

# 二值化处理,去掉背景干扰
threshold = 156
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table,'1')

# 显示图片
image.show()
# OCR识别
print(pytesseract.image_to_string(image))
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from io import BytesIO
import pytesseract,re
import time

driver = webdriver.Chrome()
driver.get("http://www.porters.vip/captcha/mathes.html")
# 应对可能出现的网络延迟
time.sleep(1.5)

# 定位元素并截图
# img = driver.find_element(By.XPATH,'//*[@id="matchesCanvas"]').screenshot_as_png
img = driver.find_element(By.CSS_SELECTOR,"#matchesCanvas").screenshot_as_png
# 在内存里打开图片
# 此处图片处理一下,效果会更好
verify_img = Image.open(BytesIO(img))
# 图片提取文字
code = pytesseract.image_to_string(verify_img)
print(code)


# 提取所需要的数据
compi = re.search('(\d+.*?\d+)',code)

# 输入并登陆,xpath和css语法
# input_code = driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(eval(compi.group(1)))
# login = driver.find_element(By.XPATH,'//div[@class="col-sm-4"]/button').click()
input_code = driver.find_element(By.CSS_SELECTOR,'#code').send_keys(eval(compi.group(1)))
login = driver.find_element(By.CSS_SELECTOR,'button.btn').click()

time.sleep(3)
driver.close()

太长了,本文章进阶的下半部分

tesseract是开源免费的库,识别率有限,

不过支持图片训练

百度和腾讯的OCR识别接口效果很好

 

点个赞呗<( ̄︶ ̄)>

​ 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值