图文混淆,验证码反爬(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识别接口效果很好
点个赞呗