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检测远程udp端口是否打开的方法
Mar 14 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
Python的math模块中的常用数学函数整理
Feb 04 Python
Python中字典的setdefault()方法教程
Feb 07 Python
python中使用正则表达式的连接符示例代码
Oct 10 Python
python编辑用户登入界面的实现代码
Jul 16 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
在Python中通过getattr获取对象引用的方法
Jan 21 Python
python从入门到精通 windows安装python图文教程
May 18 Python
python画图把时间作为横坐标的方法
Jul 07 Python
使用Windows批处理和WMI设置Python的环境变量方法
Aug 14 Python
基于Python数据结构之递归与回溯搜索
Feb 26 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
PIGCMS 如何关闭聊天机器人
2015/02/12 PHP
jQuery的一些注意
2006/12/06 Javascript
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
Bootstrap实现下拉菜单多级联动
2017/11/23 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
在Python中使用dict和set方法的教程
2015/04/27 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
PyTorch中的C++扩展实现
2020/04/02 Python
python 实现端口扫描工具
2020/12/18 Python
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
数据库面试要点基本概念
2013/10/31 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
趣味比赛活动方案
2014/02/15 职场文书
绘画专业自荐信
2014/07/04 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
考研导师推荐信范文
2015/03/27 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
Java工作中实用的代码优化技巧分享
2022/04/21 Java/Android