爬虫beautifulsoup爬取豆瓣读书数据

爬虫beautifulsoup爬取豆瓣读书数据:主要是爬取收集书的名字、类别、简介,用于接下来的聚类学习。

豆瓣链接:https://book.douban.com/tag/?view=type&icn=index-sorttags-all

代码如下:

import ssl
import bs4
import re
import requests
import csv
import codecs  #字符编码codecs(读取文件)
import time

from urllib import request, error

context = ssl._create_unverified_context()  #防止出现ssl网站证书警告


class DouBanSpider:
    def __init__(self):
        self.userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
        self.headers = {"User-Agent": self.userAgent}

    # 拿到豆瓣图书的分类标签
    def getBookCategroies(self):
        try:
            url = "https://book.douban.com/tag/?view=type&icn=index-sorttags-all"
            response = request.urlopen(url, context=context)
            content = response.read().decode("utf-8") #返回的是html
            return content
        except error.HTTPError as identifier:
            print("errorCode: " + identifier.code + "errrorReason: " + identifier.reason)
            return None

    # 找到每个标签的内容
    def getCategroiesContent(self):
        content = self.getBookCategroies()
        if not content:
            print("页面抓取失败...")
            return None
        soup = bs4.BeautifulSoup(content, "lxml")
        categroyMatch = re.compile(r"^/tag/*") #^ 表示正则匹配以/tag/为开头的,*表示正则匹配前面的子表达式零次或多次
        categroies = []
        for categroy in soup.find_all("a", {"href": categroyMatch}):
            if categroy:     #格式是这样的: 小说  外国文学
                categroies.append(categroy.string)
                # print(categroies) #格式是这样的: ['小说', '外国文学', '文学',……]
        return categroies

    # 拿到每个标签的链接
    def getCategroyLink(self):
        categroies = self.getCategroiesContent()
        categroyLinks = []
        for item in categroies:
            link = "https://book.douban.com/tag/" + str(item)
            categroyLinks.append(link)
        return categroyLinks

    #获取'title', 'tag', 'info', 'comments', 'content'内容,只爬了第一页
    def getBookInfo(self, categroyLinks):
        self.setCsvTitle()
        categroies = categroyLinks
        try:
            for link in categroies:
                print("正在爬取:" + link)
                bookList = []
                response = requests.get(link)
                soup = bs4.BeautifulSoup(response.text, 'lxml')
                bookCategroy = soup.h1.string
                for book in soup.find_all("li", {"class": "subject-item"}):
                    bookSoup = bs4.BeautifulSoup(str(book), "lxml")
                    bookTitle = bookSoup.h2.a["title"]
                    print(bookTitle)
                    bookAuthor = bookSoup.find("div", {"class": "pub"})
                    print(bookAuthor)
                    bookComment = bookSoup.find("span", {"class": "pl"})
                    print(bookComment)
                    bookContent = bookSoup.li.p
                    print(bookContent)
                    if bookTitle and bookAuthor and bookComment and bookContent:
                        bookList.append([bookTitle.strip(),bookCategroy.strip() , bookAuthor.string.strip(),
                                         bookComment.string.strip(), bookContent.string.strip()])
                self.saveBookInfo(bookList)
                time.sleep(3)

            print("爬取结束....")

        except error.HTTPError as identifier:
            print("errorCode: " + identifier.code + "errrorReason: " + identifier.reason)
            return None

    def setCsvTitle(self):
        csvFile = codecs.open("data/data1.csv", 'a', 'utf_8_sig')
        try:
            writer = csv.writer(csvFile)
            writer.writerow(['title', 'tag', 'info', 'comments', 'content'])
        finally:
            csvFile.close()

    def saveBookInfo(self, bookList):
        bookList = bookList
        csvFile = codecs.open("data/data1.csv", 'a', 'utf_8_sig')
        try:
            writer = csv.writer(csvFile)
            for book in bookList:
                writer.writerow(book)
        finally:
            csvFile.close()

    def start(self):
        categroyLink = self.getCategroyLink()
        self.getBookInfo(categroyLink)


douBanSpider = DouBanSpider()
douBanSpider.start()

结果:

title,tag,info,comments,content
活着,豆瓣图书标签: 小说,余华 / 作家出版社 / 2012-8-1 / 20.00元,(233267人评价),《活着(新版)》讲述了农村人福贵悲惨的人生遭遇。福贵本是个阔少爷,可他嗜赌如命,终于赌光了家业,一贫如洗。他的父亲被他活活气死,母亲则在穷困中患了重病,福贵...
解忧杂货店,豆瓣图书标签: 小说,[日] 东野圭吾 / 李盈春 / 南海出版公司 / 2014-5 / 39.50元,(435177人评价),"现代人内心流失的东西,这家杂货店能帮你找回——
僻静的街道旁有一家杂货店,只要写下烦恼投进卷帘门的投信口,第二天就会在店后的牛奶箱里得到回答。
因男友身患绝..."
追风筝的人,豆瓣图书标签: 小说,[美] 卡勒德·胡赛尼 / 李继宏 / 上海人民出版社 / 2006-5 / 29.00元,(447477人评价),12岁的阿富汗富家少爷阿米尔与仆人哈桑情同手足。然而,在一场风筝比赛后,发生了一件悲惨不堪的事,阿米尔为自己的懦弱感到自责和痛苦,逼走了哈桑,不久,自己也跟...
白夜行,豆瓣图书标签: 小说,[日] 东野圭吾 / 刘姿君 / 南海出版公司 / 2008-9 / 29.80元,(322044人评价),“只希望能手牵手在太阳下散步”,这个象征故事内核的绝望念想,有如一个美丽的幌子,随着无数凌乱、压抑、悲凉的故事片段像纪录片一样一一还原:没有痴痴相思,没有海...
三体,豆瓣图书标签: 小说,刘慈欣 / 重庆出版社 / 2008-1 / 23.00,(265880人评价),文化大革命如火如荼进行的同时。军方探寻外星文明的绝秘计划“红岸工程”取得了突破性进展。但在按下发射键的那一刻,历经劫难的叶文洁没有意识到,她彻底改变了人类的...
月亮与六便士,豆瓣图书标签: 小说,[英] 威廉·萨默塞特·毛姆 / 徐淳刚 / 浙江文艺出版社 / 2017-1-1 / 39.80元,(61993人评价),"“满地都是六便士,他却抬头看见了月亮。”
银行家查尔斯,人到中年,事业有成,为了追求内心隐秘的绘画梦想,突然抛妻别子,弃家出走。他深知:人的每一种身份都是一..."
嫌疑人X的献身,豆瓣图书标签: 小说,[日] 东野圭吾 / 刘子倩 / 南海出版公司 / 2008-9 / 28.00,(264405人评价),"百年一遇的数学天才石神,每天唯一的乐趣,便是去固定的便当店买午餐,只为看一眼在便当店做事的邻居靖子。
靖子与女儿相依为命,失手杀了前来纠缠的前夫。石神提出由..."
房思琪的初恋乐园,豆瓣图书标签: 小说,林奕含 / 北京联合出版公司 / 2018-1 / 45.00元,(78425人评价),"令人心碎却无能为力的真实故事。
向死而生的文学绝唱  打动万千读者的年度华语小说。
李银河 戴锦华 骆以军 张悦然 冯唐 詹宏志 蒋方舟 史航 等多位学者作..."
围城,豆瓣图书标签: 小说,钱锺书 / 人民文学出版社 / 1991-2 / 19.00,(268227人评价),《围城》是钱钟书所著的长篇小说。第一版于1947年由上海晨光出版公司出版。1949年之后,由于政治等方面的原因,本书长期无法在中国大陆和台湾重印,仅在香港出...
百年孤独,豆瓣图书标签: 小说,[哥伦比亚] 加西亚·马尔克斯 / 范晔 / 南海出版公司 / 2011-6 / 39.50元,(196987人评价),《百年孤独》是魔幻现实主义文学的代表作,描写了布恩迪亚家族七代人的传奇故事,以及加勒比海沿岸小镇马孔多的百年兴衰,反映了拉丁美洲一个世纪以来风云变幻的历史。...
平凡的世界(全三部),豆瓣图书标签: 小说,路遥 / 人民文学出版社 / 2005-1 / 64.00元,(163371人评价),《平凡的世界》是一部现实主义小说,也是一部小说形式的家族史。作者浓缩了中国西北农村的历史变迁过程,在小说中全景式地表现了中国当代城乡的社会生活。在近十年的广...
红楼梦,豆瓣图书标签: 小说,[清] 曹雪芹 著、高鹗 续 / 人民文学出版社 / 1996-12 / 59.70元,(187080人评价),《红楼梦》是一部百科全书式的长篇小说。以宝黛爱情悲剧为主线,以四大家族的荣辱兴衰为背景,描绘出18世纪中国封建社会的方方面面,以及封建专制下新兴资本主义民主...
许三观卖血记,豆瓣图书标签: 小说,余华 / 南海出版公司 / 1998-9 / 16.80元,(115999人评价),《许三观卖血记》是余华1995年创作的一部长篇小说,它以博大的温情描绘了磨难中的人生,以激烈的故事形式表达了人在面对厄运时求生的欲望。小说讲述了许三观靠着卖...
霍乱时期的爱情,豆瓣图书标签: 小说,[哥伦比亚] 加西亚·马尔克斯 / 杨玲 / 南海出版公司 / 2012-9-1 / 39.50元,(115399人评价),"★马尔克斯唯一正式授权,首次完整翻译

这种代码的风格值得我这种菜鸟学习。。。

参考:Python自然语言处理实战

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