爬取草书网站(http://www.shufazidian.com/)的草书字体图片
要求
在书法字体查询网站http://www.shufazidian.com/爬取草书的字体图片,并将其保存到本地文件夹,以汉字为文件名,以人名为保存的图片名。
关于所用库的介绍
requests库:
使用pip install requests即可完成安装,是用于爬虫的关键库,requests库简单易上手,requests实现了 HTTP协议中绝大部分功能,它提供的功能包括 Keep-Alive、连接池、Cookie持久化、内容自动解压、HTTP代理、SSL认证、连接超时、Session等很多特性,可支持get请求,post表单请求,最重要的是它同时兼容 python2 和 python3。
os模块:
python的os模块是内置标准库,不需要额外下载,可以直接导入使用。
os 模块提供了访问操作系统服务的功能,在对文件进行操作的时候,open() 这个内建函数可以打开文件,但是如果要对文件进行重命名,删除等操作,就要用到 os 模块的方法。
BeautifulSoup库:
在使用BeautifulSoup库时需要使用pip install bs4命令安装,然后通过from bs4 import beautifulsoup导入使用,Beautiful Soup库是解析、遍历、维护“标签树”的功能库。Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。通过Beautiful Soup库,我们可以将指定的class或id值作为参数,来直接获取到对应标签的相关数据,这样的处理方式简洁明了。此外,BeautifulSoup在使用时依赖解析器,如lxml,html5lib等,需要额外下载。
代码解读
本项目由以下四个函数构成,
get_page(url,word): #获取网页元素
parse_page(html): #解析网页
to_file(url,word): #将文件保存到本地
main (): #主函数
1.get_page(url,word)函数
def get_page(url,word):
try:
headers = {
'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 ' #构造爬虫请求头
'(KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
"referer": "http://www.shufazidian.com/",
"Accept": "text/html, application/xhtml+xml, image/jxr, */*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN",
"Cache-Control": "no-cache",
"Connection": "Keep-Alive",
"Content-Length": "19",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie":"cookiesort=7;
Hm_lvt_5ac259f575081df787744e91bb73f04e=1563974376,1564218809; Hm_lpvt_5ac259f575081df787744e91bb73f04e=1564226330",
'Host': 'www.shufazidian.com'
}
data = {
'wd' : word,
'sort': 7
}
r = requests.post(url, headers= headers,data= data) # post请求
r.raise_for_status() #自动解析网页编码
r.encoding = r.apparent_encoding
return r.content
except:
return ""
此函数主要用于获取网页html信息,其中的headers中包含的是构造爬虫的请求头,data中包含的是在用requests库进行爬虫时提交的post表单信息。
data = {
‘wd’ : word,
‘sort’: 7
}
通过分析网页可以得出,草书的post表单请求,草书对应的打代码的标签为“7”,而且所搜的字体会传输到data的“wd”中,故构造data表单请求并将word字体的数据传送到,“wd”中。
然后调用我们的requests库进行爬取信息,将信息返回,用requests库中的content方法即可。
2.parse_page(html)函数
def parse_page(html):
soup = BeautifulSoup(html ,"lxml") #解析网页
pics = soup.find_all(class_="mbpho") #获得图片所在的标签
pic_link = list()
name = list()
for i in range(1,len(pics)):
pic = pics[i].find(name="a").find(name="img")["src"] #获得图片的链接并存入列表
pic_link.append(pic)
title = pics[i].find(name="a")["title"] #获得图片的作者并存入列表
name.append(title)
pic_dic = dict(zip(pic_link,name)) #构造图片和作者一一对应的字典
return pic_dic
此函数的功能是调用BeautifulSoup库解析网页内容,由上图内容可以看出,我们所要获取的内容都包含在一个class=”b=mbpho”的标签里,其中href中包含的是图片的的链接,title的内容是图片的人名。所以,首先构造BeautifulSoup的实例对象soup,将html传入函数,并用lxml解析器解析,然后调用BeautifulSoup中的find_all方法进行信息的搜查和提取,并将所获得的图片链接以及图片名字存入列表,最后调用的zip()方法,构造字典将图片链接和图片的人名一一对应并返回字典。
3.to_file(url,word)函数
def to_file(url,word):
if not os.path.exists("E://shufa"): #创建书法目录
os.mkdir("E://shufa")
path = "E://shufa//"+word #创建搜索图片目录
if not os.path.exists(path):
os.mkdir(path)
os.chdir(path) #改变当前工作目录到path
html = get_page(url, word) #获得网页的html
pic_dic = parse_page(html) #解析网页html,返回图片链接和图片作者对应的字典
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0)like Gecko Core/1.70.3704.400 QQBrowser/10.4.3587.400",
"Cookie": "cookiesort=7; Hm_lvt_5ac259f575081df787744e91bb73f04e=1563974376,1564218809; Hm_lpvt_5ac259f575081df787744e91bb73f04e=1564226330"
}
for item in pic_dic:
#url = item
try:
response = requests.get(item, headers=header)#获取图片链接
if response.status_code == 200:
open(pic_dic.get(item) + ".jpg", 'wb').write(response.content)
print("{} 保存成功".format(pic_dic.get(item)))
except:
return ''
to_file()函数主要是调用os库创建书法的目录并按要求保存图片,创建书法目录然后按照汉字创建汉字目录,将图片添加进去。重要的还是要再次调用requests库的get方法爬取图片,由于之前已经解析出了图片的链接,所以我们只需要将之前把保存图片的字典遍历,并将图片的链接传入get方法中即可。
4.main()函数
def main ():
url = "http://www.shufazidian.com/"
words = ["刘","陶","林","张","任","爱","你","我","草",“书”]
for word in words:
to_file(url,word)
在主函数里主要是调用to_file()函数,,将url 和 word 参数传入函数中,便可以实现对书法网站的图片抓取。
效果展示
源代码
https://blog.csdn.net/lucklydog123/article/details/100547650