爬取指定网页并制作词云图

利用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,下载完成啦!')
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值