之前第一篇博客爬取的验证码图片,对应的文件夹名字是中文,但是目前诸如tensorflow之类的训练框架对中文路径读取有很多问题,所以在这里把文件夹的名字转换成英文,当然你也可以转换成其他非中文的形式,只要保存好相应的转换对应文件,以输出正确的结果。
在这里利用百度翻译来获取相应的英文名字,还是采用selenium来实现,练习练习爬虫,程序如下。
from selenium import webdriver
import time
import json
import os
#读取中文名字
with open('picture_name.txt', 'r', encoding='utf-8') as f:
keywords = f.read().split('\n')
trans_res1 = {} #保存翻译结果,中译英,字典形式
trans_res2 = {} #英译中
browser = webdriver.Chrome()
browser.get('https://fanyi.baidu.com')
time.sleep(0.5)
browser.find_element_by_class_name('desktop-guide-close').click()
for word in keywords:
input_btn = browser.find_element_by_id('baidu_translate_input')
input_btn.clear()
input_btn.send_keys(word)
browser.find_element_by_id('translate-button').click()
time.sleep(1)
res = browser.find_element_by_class_name('ordinary-output.target-output.clearfix').text
res = res.replace(" ", "")
trans_res1[word] = res
trans_res2[res] = word
print(word, res)
json_str1 = json.dumps((trans_res1))
with open('ch2en.json', 'w') as f: #保存为json文件,中译英文件
f.write(json_str1)
print(trans_res1)
json_str2 = json.dumps((trans_res2))
with open('en2ch.json', 'w') as f: #保存为json文件,英译中文件
f.write(json_str2)
print(trans_res2)
得到翻译结果后,就可以对文件夹进行重命名了,程序如下。
import os
import json
items = os.listdir('D:/cap_data') #这是我存储图片的路径,根据自己的路径修改
with open('ch2en.json', 'r') as f: #加载中译英文件
dic = json.load(f)
for item in items:
os.rename('D:/cap_data/'+item, 'D:/cap_data/' + dic[item])
完成重命名工作后,就可以建立labels.csv文件了,也就是标签文件,后面划分训练集、验证集时需要用。程序如下。
import os
import pandas as pd
items = os.listdir('D:/cap_data')
lst = []
for item in items:
pics = os.listdir('D:/cap_data/'+item)
for pic in pics:
lst.append({'id':pic.split['.'][0], 'name':item})
data = pd.DataFrame(lst)
data.to_csv('D:/cap_data/labels.csv', index=False)
以上完成了对图片验证码的预处理工作,接下来进行文字部分的处理。在上一篇博客中最后提到需要进行标注,我在标注的时候依然采用的是中文名字标注,所以依然需要进行中译英的操作;同时一并得到labels.csv文件。因为所有文字图片都在一个文件夹里,所以处理上与前面略有不同,程序如下。
import os
import json
import pandas as pd
import shutil
path = 'D:/text_captcha/'
with open('ch2en.json', 'r') as f: #加载中译英文件
dic = json.load(f)
items = os.listdir(path)
lst = []
count = 1354558 #编号,作为新id,可根据自己喜好更改
for item in items:
ch_name = item.split(' ')[0]
new_name = 'z' + str(count)
lst.append({'id':new_name, 'name':dic[ch_name]})
os.rename(path+item, path+new_name+'.jpg')
count += 1
#创建一个新文件夹,将处理后的数据移动到这个文件夹下,方便后续训练集和验证集的划分
new_path = 'D:/data_text/'
os.mkdir(new_path)
shutil.move(path, new_path)
data = pd.DataFrame(lst) #标签文件也保存到新的文件夹下
data.to_csv(new_path+'labels.csv', index=False)
效果图
这些工作处理完之后,就可以进行训练集和验证集的划分,将在下一篇博客中出现。