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安装以及IDE的配置教程
Apr 29 Python
python3实现暴力穷举博客园密码
Jun 19 Python
Python实现读取并保存文件的类
May 11 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
python学生信息管理系统
Mar 13 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
Django框架请求生命周期实现原理
Nov 13 Python
python基于opencv实现人脸识别
Jan 04 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
一个php导出oracle库的php代码
2009/04/20 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
Jquery操作radio的简单实例
2014/01/06 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python爬取京东的商品分类与链接
2016/08/26 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
分享一个简单的python读写文件脚本
2017/11/25 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
四年大学生活的个人自我评价
2013/12/11 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
体育运动会广播稿
2014/10/05 职场文书
送达通知书
2015/04/25 职场文书
主持人大赛开场白
2015/05/29 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android