利用python中的库和函数设计一个爬取读书网中“软件与程序设计”栏的程序,并对其书名制作词云图,下载其书封面存储到本地文件中。
构建多个函数分别进行网页的请求,html的获取,所需数据的解析与爬取,词云图的构建,数据文件的存储,以及构建一个类对书图片进行下载存储。
所需的python库有:
import time
import requests
import json
from lxml import etree
from requests.exceptions import RequestException
from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import os
一、需要对单个网页完成请求操作,因此构造一个函数,函数中使用requests库的异常处理,用try…except的异常方法与if语句,判断请求是否成功
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebK'
'it/537.36 (KHTML, like Gecko) Chrome/93.0.4577.'
'82 Safari/537.36',
}
#先对一个网页发起请求
def one_page(url):
#使用一个requests的异常处理,异常方法采用try...except
try:
response=requests.get(url,headers=headers)
response.encoding='utf-8'
#判断当请求的状态代码为200时,返回bytes型的二进制数据
if response.status_code==200:
return response.content.decode('utf-8')
return None
except RequestException:
return None
二、构造函数对单个网页进行获取与解析。其中运用之前简单介绍过的lxml库中的etree和xpath语法,用一个for循环将爬取的数据以字典的形式保存至eg中,再将一个个的eg添加到book列表中
#创建一个book列表
book = []
#对单个网页所需数据进行解析
def parse_one_page(contents):
#利用lxml库中的etree解析网页
html=etree.HTML(contents)
#利用xpath语法分别对书名、网址、书封面以及作者进行匹配
names=html.xpath('//li/div/h3/a/text()')
hrefs=html.xpath('//li/div/h3/a/@href')
pictures=html.xpath("//li/div[@class='book-info']//a/img/@data-original")
authors=html.xpath("//li/div/p[position()=1]/text()")
#利用循环将四个因素以字典的形式不断添加进book列表中
for name,href,picture,author in zip(names,hrefs,pictures,authors):
Href = 'https://www.dushu.com' + href
eg={
'名字':name,
'网址':Href,
'封面':picture,
'作者':author
}
book.append(eg)
#调用write_one_file函数,将name参数传入
write_one_file(name)
三、两个函数都用来创建文件
#新建一个文本文件存储爬取数据
def write_to_file(item):
#建立的文件名为pythonbook.txt,以写入的形式对文件进行操作
with open('pythonbook.txt','a',encoding='utf-8')as f:
f.write(json.dumps(item,ensure_ascii=False)+'\n')
#创建一个文本文件存储书名
def write_one_file(Item):
with open('Nameword.txt','a',encoding='utf-8')as fp:
fp.write(json.dumps(Item,ensure_ascii=False)+'\n')
四、构造一个函数用于读取多页网页
在这里插入代码片#建一个函数用于读取多页网页数据
def main():
offset=1
while offset<41:
#将offset转换为字符串
url='https://www.dushu.com/book/1463_'+str(offset)+'.html'
contents=one_page(url)
parse_one_page(contents)
offset+=1
#利用for循环将book列表中的元素作为参数陆续传入write_to_file函数
for item in book:
write_to_file(item)
五、对书名制作词云图
#制作书名的词云图
def wordcloudplot(txt):
#设置中文字体
path = r'C:\Windows\Fonts\msyh.ttc'
wordcloud = WordCloud(font_path=path, #设置词云图的字体
background_color="white", #设置词云图的背景颜色
margin=5,
width=500,
height=300,
max_words=200, #设置最大出现的字数
max_font_size=180, #显示最大的字体大小
min_font_size=15, #显示的最小的字体大小
prefer_horizontal=0.7,
relative_scaling=0.5,
repeat=True, #允许重复的词出现
scale=0.7,
random_state=30 #设置有多少种随机生成状态,即有多少种配色方案
)
#根据文本生成词云
wordcloud = wordcloud.generate(txt)
#初始化一张画布
plt.subplots(figsize=(12,8),dpi=300)
#显示图片,同时也显示其格式
plt.imshow(wordcloud)
#关闭坐标轴
plt.axis("off")
plt.show()
六、使用 jieba.cut 对书名文本文件进行切分,将切分的词存入一个列表,再调用上方的wordcloudplot函数进行词云图的合成
def Main():
a = []
f = open(r'Nameword.txt', 'r', encoding='utf-8').read()
#生成一个生成器,切分书名,将切分的结果存入列表中
words = list(jieba.cut(f))
for word in words:
if len(word) > 1:
a.append(word)
txt = r' '.join(a)
wordcloudplot(txt)
七、创建一个类用于下载书封面
#创建一个类用于下载书封面
class Download:
def download(self):
x=0
print('开始下载书封面啦!')
print('*'*100)
path='D:\\photo'
#利用os.path.exists判断文件路径是否存在,若不存在则创建该文件
if not os.path.exists(path):
os.makedirs(path)
for offset in range(1,42):
url = 'https://www.dushu.com/book/1463_' + str(offset) + '.html'
contents = one_page(url)
html = etree.HTML(contents)
pictures = html.xpath("//li/div[@class='book-info']//a/img/@src")
for i in range(40):
response = requests.get(pictures[i], headers=headers)
r = response.content
with open('D:\\photo\picture'+str(x+1)+'.jpg','wb')as f:
print('正在下载图片·······'+str(x+1))
f.write(r)
#每下载一张图片停顿0.5秒
time.sleep(0.5)
#关闭文件
f.close()
x+=1
print('Over,下载完成啦!')