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中使用select模块实现非阻塞的IO
Feb 03 Python
python中Genarator函数用法分析
Apr 08 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
Python中turtle作图示例
Nov 15 Python
python实现图像识别功能
Jan 29 Python
用python 批量更改图像尺寸到统一大小的方法
Mar 31 Python
pandas.cut具体使用总结
Jun 24 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
python matplotlib imshow热图坐标替换/映射实例
Mar 14 Python
parser.add_argument中的action使用
Apr 20 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
Jan 08 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
JavaScript 继承详解(二)
2009/07/13 Javascript
JS OOP包机制,类创建的方法定义
2009/11/02 Javascript
js更优雅的兼容
2010/08/12 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
javascript中神奇的 Date对象小结
2017/10/12 Javascript
Less 安装及基本用法
2018/05/05 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python通过属性手段实现只允许调用一次的示例讲解
2018/04/21 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python实现XML解析的方法解析
2019/11/16 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
python实现udp聊天窗口
2020/03/31 Python
详解Scrapy Redis入门实战
2020/11/18 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
预备党员入党思想汇报
2014/01/04 职场文书
建设工地安全标语
2014/06/07 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
教你部署vue项目到docker
2022/04/05 Vue.js
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android
Python日志模块logging用法
2022/06/05 Python