Python爬取豆瓣高分图书TOP100存入Excel

 

        作为一名转行过来的新手小白,花了两周业余时间,在B站上把北京理工大学嵩天老师的“Python语言程序设计”和“Python网络爬虫与信息提取”看了一遍,心里跃跃欲试想自己亲手爬取一个网站的信息来验证一下自己的学习情况。
        俗话说“纸上得来终觉浅,绝知此事要躬行”,当你真正下手去写的时候,会发现很多细节问题需要去解决。

        在网上找了个相对简单的网页豆瓣高分图书TOP100,由于对正则表达式掌握的不是很好,本次采用requests库和BeautifulSoup库相结合,对网页进行爬取。

        通过对网页进行分析,一本书包含了书名、评分、评论数、作者、出版社和出版时间六个主要信息,然后相应构建了以下几个函数:

        1、获取网站地址:mkUrl();

        2、获取网页内容:getHTMLText();

        3、获取Soup:htmlParse();

        4、书名解析,获取书名列表:bkNameParse();

        5、评分解析,获取评分列表:ratingScoreParse();

        6、评论数解析,获取评论数列表:ratingNumParse();

        7、通过对书的简介解析,获取简介列表:abstrParse();之后发现简介中包括:作者、出版社和出版时间三条信息,于是又将其拆分成了三个函数,分别为:

                    a、获得作者列表:authorList()

                    b、获得出版社列表:pubList()

                    c、获得出版时间列表:pubYearList()

         8、最后采用main()函数将各个函数功能进行汇总输出。

         本次爬取的重难点在对网页源代码的信息提取,主要采用的是BeautifulSoup库的find_all()函数对属性进行查找,获得有用信息,然后采用字符串处理方法对获得的信息进行精简,去掉其中空格及换行等多余符号,再将信息存储到列表中去。

         本次爬取网页的源代码如下:

import requests
from bs4 import BeautifulSoup
from openpyxl import workbook, load_workbook

#获取网站地址
def get_url():
    for i in range(4):
        url = "https://www.douban.com/doulist/45004834/?\
        start="+str(i*25)+"&sort=time&playable=0&sub_type="
        yield url

#获取网页内容
def getHTMLText(url):
    try:
        r = requests.get(url)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

#对网页进行解析,返回soup
def htmlParse(html):
    soup = BeautifulSoup(html, 'html.parser')
    return soup
    
#书名解析,返回书名列表
def bkNameParse(soup):
    bk_list = []
    for a in soup.find_all(class_="title"):
        bkName = a.find('a').string    #书名
        bk_list.append(bkName.strip(" \n"))
    return bk_list

#评分解析,返回评分列表
def ratingScoreParse(soup):
    rating_score_list = []
    for rating in soup.find_all(class_="rating"):
        ratingScore = rating.find_all("span")[1].string   #评分
        rating_score_list.append(ratingScore)
    return rating_score_list

#评论数解析,返回评论数列表
def ratingNumParse(soup):
    rating_num_list = []
    for rating in soup.find_all(class_="rating"):
        ratingNums = rating.find_all("span")[2].string    #评论数
        rating_num_list.append(ratingNums.strip("()"))
    return rating_num_list

#对书名简介进行解析,返回简介列表
def abstrParse(soup):
    abstr_list = []
    for abstr in soup.find_all(class_="abstract"):
        abstrInfo = abstr.get_text()
        abstr_list.append(abstrInfo.strip(" \n").\
            split("\n            \n          "))
    return abstr_list

#获得作者列表
def authorList(abstrLs):
    authLs = []
    for abstr in abstrLs:
        authLs.append(abstr[0][4:])
    return authLs

#获得出版社列表
def pubList(abstrLs):
    pubLs = []
    for abstr in abstrLs:
        pubLs.append(abstr[1][5:])
    return pubLs

#获得出版年份列表
def pubYearList(abstrLs):
    pubYrLs = []
    for abstr in abstrLs:
        pubYrLs.append(abstr[-1][5:])
    return pubYrLs

if __name__ == '__main__':
    wb = workbook.Workbook()
    ws = wb.active
    ws.append(['书名', '评分', '评论数', '作者', '出版社', '出版时间'])
    urlList = mkUrl()
    for url in urlList:
        h = requests.get(url)
        soup = htmlParse(h)
        nameList = bkNameParse(soup)
        scoreList = ratingScoreParse(soup)
        numList = ratingNumParse(soup)
        abstrList = abstrParse(soup)
        authList = authorList(abstrList)
        pubCompyList = pubList(abstrList)
        pubYrList = pubYearList(abstrList)
        for i in range(25):
            ws.append([nameList[i], scoreList[i], numList[i], \
                   authList[i], pubCompyList[i], pubYrList[i]])
    wb.save("book.xlsx")

         爬取到了网页内容后,通过openpyxl库的workbook,load_workbook函数将爬取的内容保存到excel表中

 

 

 

 

               最后再来几张最终成果图:

Python爬取豆瓣高分图书TOP100存入Excel_第1张图片

Python爬取豆瓣高分图书TOP100存入Excel_第2张图片

你可能感兴趣的:(爬虫)