python脚本爬取字体文件的实现方法


Posted in Python onApril 29, 2017

前言

大家应该都有所体会,为了提高验证码的识别准确率,我们当然要首先得到足够多的测试数据。验证码下载下来容易,但是需要人脑手工识别着实让人受不了,于是我就想了个折衷的办法——自己造验证码。

为了保证多样性,首先当然需要不同的字模了,直接用类似ttf格式的字体文件即可,网上有很多ttf格式的字体包供我们下载。当然,我不会傻到手动下载解压缩,果断要写个爬虫了。

实现方法

网站一:fontsquirrel.com

这个网站的字体可以免费下载,但是有很多下载点都是外链连接到其他网站的,这部分得忽略掉。

#coding:utf-8
import urllib2,cookielib,sys,re,os,zipfile
import numpy as np
#网站登陆
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36))')]
urllib2.install_opener(opener)
#搜索可下载连接
def search(path):
 request=urllib2.Request(path)
 response=urllib2.urlopen(request)
 html=response.read()
 html=html.replace('\n',' ')#将所有的回车去掉,因为正则表达式是单行匹配。。。。。。
 urls=re.findall(r'<a href="(.*?)" rel="external nofollow" >(.*?)</a>',html)
 for i in urls:
  url,inner=i
  if not re.findall(r'Download ',inner)==[] and re.findall(r'offsite',inner)==[] and url not in items:
   items.append(url)
items=[]#保存下载地址
for i in xrange(15):
 host='http://www.fontsquirrel.com/fonts/list/find_fonts/'+str(i*50)+'?filter%5Bdownload%5D=local'
 search(host)
if not os.path.exists('ttf'):
 os.mkdir('ttf')
os.chdir('ttf')
def unzip(rawfile,outputdir):
 if zipfile.is_zipfile(rawfile):
  print 'yes'
  fz=zipfile.ZipFile(rawfile,'r')
  for files in fz.namelist():
   print(files) #打印zip归档中目录
   fz.extract(files,outputdir)#解压缩文件
 else:
  print 'no'
for i in items: 
 print i
 request=urllib2.Request('http://www.fontsquirrel.com'+i)
 response=urllib2.urlopen(request)
 html=response.read()
 name=i.split('/')[-1]+'.zip'
 f=open(name,'w')
 f.write(html)
 f.close()#文件记得关闭,否则下面unzip会出错
 unzip(name,'./')
 os.remove(name)
os.listdir(os.getcwd())
os.chdir('../')
files=os.listdir('ttf/')
for i in files:#删除无用文件
 if not (i.split('.')[-1]=='ttf' or i.split('.')[-1]=='otf'):
  if os.path.isdir(i):
   os.removedirs('ttf/'+i)
  else:
   os.remove('ttf/'+i)
print len(os.listdir('ttf/'))

搞到了2000+个字体,种类也挺多的,蛮好。

网站二:dafont.com

这个网站的字体花样比较多,下载起来也比较方便,恶心的是他的文件名的编码好像有点问题。

#coding:utf-8
import urllib2,cookielib,sys,re,os,zipfile
import shutil
import numpy as np
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders=[('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36))')]
urllib2.install_opener(opener)
items=[]
def search(path):
 request=urllib2.Request(path)
 response=urllib2.urlopen(request)
 html=response.read()
 html=html.replace('\n',' ')
 urls=re.findall(r'href=\"(http://dl.dafont.com/dl/\?f=.*?)\" >',html)
 items.extend(urls)
for i in xrange(117):
 host='http://www.dafont.com/new.php?page='+str(i+1)
 search(host)
 print 'Page'+str(i+1)+'done'
 items=list(set(items))
 print len(items)
if not os.path.exists('ttf2'):
 os.mkdir('ttf2')
os.chdir('ttf2')
def unzip(rawfile,outputdir):
 if zipfile.is_zipfile(rawfile):
  print 'yes'
  fz=zipfile.ZipFile(rawfile,'r')
  for files in fz.namelist():
   print(files) #打印zip归档中目录
   fz.extract(files,outputdir)
 else:
  print 'no'
for i in items: 
 print i
 request=urllib2.Request(i)
 response=urllib2.urlopen(request)
 html=response.read()
 name=i.split('=')[-1]+'.zip'
 f=open(name,'w')
 f.write(html)
 f.close()
 unzip(name,'./')
 os.remove(name)
print os.listdir(os.getcwd())
for root ,dire,fis in os.walk('./'):#递归遍历文件夹
 for i in fis:
  if not (i.split('.')[-1]=='ttf' or i.split('.')[-1]=='otf'):
   os.remove(root+i)
   print i
for i in os.listdir('./'):
 if os.path.isdir(i):
  os.rmdir(i)
os.chdir('../')

总体操作跟之前的差不多,跑了几十分钟下了4000多的字体。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python从MP3文件获取id3的方法
Jun 15 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
Flask之flask-script模块使用
Jul 26 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
django 微信网页授权登陆的实现
Jul 30 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
PyTorch的SoftMax交叉熵损失和梯度用法
Jan 15 Python
python给list排序的简单方法
Dec 10 Python
Python在图片中添加文字的两种方法
Apr 29 #Python
Python实现对字符串的加密解密方法示例
Apr 29 #Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 #Python
python基于pyDes库实现des加密的方法
Apr 29 #Python
Python简单实现Base64编码和解码的方法
Apr 29 #Python
Python变量和字符串详解
Apr 29 #Python
python实现unicode转中文及转换默认编码的方法
Apr 29 #Python
You might like
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
html中table数据排序的js代码
2011/08/09 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
javascript里绝对用的上的字符分割函数总结
2014/07/31 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
React Native使用百度Echarts显示图表的示例代码
2017/11/07 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
Vue实现穿梭框效果
2020/09/30 Javascript
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python使用requests.session模拟登录
2019/08/09 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
python中封包建立过程实例
2021/02/18 Python
网上商城创业计划书范文
2014/01/31 职场文书
教师校本培训方案
2014/02/26 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
小学毕业演讲稿
2014/04/25 职场文书
2014年节能工作总结
2014/12/18 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
小石潭记导游词
2015/02/03 职场文书
优秀团员自我评价
2015/03/10 职场文书
工程服务质量承诺书
2015/04/29 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS