> 文档中心 > 图文混淆,验证码反爬(Steamboat练习)

图文混淆,验证码反爬(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_stringimport requestsfrom parsel import Selectorfrom pytesseract import image_to_stringfrom PIL import Imageimport iourl = "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 Imagefrom io import BytesIOimport pytesseract,requestsfrom parsel import Selectorbase_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 + srcimg_res = requests.get(img_url)# 把图片黑白处理image = Image.open(BytesIO(img_res.content)).convert('L')# 二值化处理,去掉背景干扰threshold = 156table = []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 Imagefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom io import BytesIOimport pytesseract,reimport timedriver = 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_pngimg = 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识别接口效果很好

 

点个赞呗

​