Python爬虫批量下载字体文件的实战指南
本文介绍如何使用Python编写爬虫程序,从Fontsquirrel和DaFont等网站批量下载TTF和OTF字体文件。通过解析网页链接、处理Cookie及过滤无效外链,实现自动化获取大量字体资源,为验证码识别等场景提供充足的数据支持。
前言
在提升验证码识别准确率的过程中,获取充足的测试数据是关键。虽然直接下载验证码图片相对简单,但人工逐一识别不仅耗时且效率低下。为此,一种折中的解决方案是自主生成验证码,而实现这一目标的前提是拥有多样化的字模资源。
为了确保字模的多样性,直接使用如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
DaFont网站上的字体款式丰富,下载操作也较为简便。然而,该网站文件名编码存在一定问题,可能在处理过程中带来额外的挑战。
#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学习或实际应用中有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













