爬取豆瓣网评论最多的书籍

相信很多人都有书荒的时候,想要找到一本合适的书籍确实不容易,所以这次利用刚学习到的知识爬取豆瓣网的各类书籍,传送门https://book.douban.com/tag/?view=cloud

首先是这个程序的结构,html_downloader是html下载器,html_outputer是导出到Excel表,html_parser是解析页面,make_wordcloud是制作词云,spided_main是程序入口,url_manager是URL管理器

主要实现思路是先请求下载需要的html,解析得到目标URL并存储到URL管理器中,再从URL管理器中获取得到URL,发送请求,解析得到需要的信息内容,导出到Excel表格,再重Excel表中获取数据进行分析得到词云。

html_downloader:

# -*- coding:utf8 -*-
import urllib.request
from urllib.parse import quote
import string

class HtmlDownloader(object):

    def download(self,url):
        if url is None:
            return  None
        s = quote(url, safe=string.printable) #url里有中文需要添加这一句,不然乱码
        response = urllib.request.urlopen(s)

        if response.getcode()!= 200:
            return None

        return  response.read()

通过分析豆瓣网的结构,可以看到,我们首先传进去的是总的图书分类,但是我们需要的是每一个分类里面的图书信息。所以我们需要得到每一个分类的url,再通过这个url去获取图书url,所以就有base_url和detail_url。

url_manager:

# -*- coding:utf8 -*-

class UrlManage(object):
    def __init__(self):
        self.base_urls = set()  #基本分类的URL
        self.detail_urls = set() #详细内容页的URL
        self.old_base_urls = set()
        self.old_detail_urls = set()
  #添加单个url
    def add_base_url(self,url):
        if url is None:
            return
        if url not in self.base_urls and url not in self.old_base_urls:
            self.base_urls.add(url)

    def add_detail_url(self,url):
        if url is None:
            return
        if url not in self.detail_urls and url not in self.old_detail_urls:
            self.detail_urls.add(url)
            # print(self.detail_urls)

    # 添加多个url
    def add_new_detail_urls(self, urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_detail_url(url)

    def add_new_base_urls(self, urls):
        if urls is None or len(urls) == 0:
            return
        for url in urls:
            self.add_base_url(url)
  #判断是否还有url
    def has_new_detail_url(self):
        return len(self.detail_urls)!=0

    def has_new_base_url(self):
        return len(self.base_urls)!=0
  #得到一个新的url
    def get_base_url(self):
        new_base_url = self.base_urls.pop()
        self.old_base_urls.add(new_base_url)
        return new_base_url

    def get_detail_url(self):
        new_detail_url = self.detail_urls.pop()
        self.old_detail_urls.add(new_detail_url)
        return new_detail_url

 

解析器 html_parser:

# -*- coding:utf8 -*-
import re
from urllib.parse import urlparse
from bs4 import BeautifulSoup

class HtmlParser(object):
    def soup(cont):
        soups = BeautifulSoup(cont, ‘html.parser‘, from_encoding=‘utf-8‘)
        return soups

    def get_new_data(soup):
        dict = {}
        if (soup.select(‘.subject-list‘)[0].contents):
            li = soup.select(‘.subject-list‘)[0].select(‘.subject-item‘)
            di = {}
            for i in li:
                bookname = i.select(‘.info‘)[0].select(‘a‘)[0].attrs[‘title‘]  # 书名
                comment = i.select(‘.clearfix‘)[0].select(‘.pl‘)[0].text
                comment = re.findall(‘\d+‘, comment)[0]
                di[bookname] = comment
        if di:  # 返回的字典不为空的时候
            dict.update(di)
        return dict

    # 得到详细内容的url
    def get_detail_url(base_url):
        detail_urls = set()
        for k in range(0, 501, 20):
            if (k == 0):
                urls = base_url
                # print(urls)
            else:
                urls = base_url + ‘?start={}&type=T‘.format(k)
                # print(urls)
            detail_urls.add(urls)
        return detail_urls

    # baseurl
    def get_all_base_urls(soup):
        links = soup.select(‘.tagCol‘)[0].select(‘a‘)
        base_urls = set()
        for link in links:
            new_full_url = ‘https://book.douban.com{}‘.format(link.attrs[‘href‘])
            # HtmlParser.get_detail_url(new_full_url)
            base_urls.add(new_full_url)
        return base_urls

    def parser(cont):
        soup = BeautifulSoup(cont, ‘html.parser‘, from_encoding=‘utf-8‘)
        base_urls = HtmlParser.get_all_base_urls(soup)
        return base_urls

  

spided_main:

# -*- coding:utf8 -*-
from douban_spider2 import url_manager, html_downloader, html_parser, html_outputer

class SpiderMain(object):
    def __init__(self):
        self.urls = url_manager.UrlManage()
        self.downloader = html_downloader.HtmlDownloader()
        self.htmlparser = html_parser.HtmlParser
        self.outputer = html_outputer.HtmlOutputer()

    def craw(self,root_url):
        count = 1
        dictdata = {}
        cont = self.downloader.download(root_url)
        base_urls = self.htmlparser.parser(cont)
        self.urls.add_new_base_urls(base_urls)
        while self.urls.has_new_base_url():
            try:
                base_url = self.urls.get_base_url()
                detail_urls = self.htmlparser.get_detail_url(base_url)
                self.urls.add_new_detail_urls(detail_urls)
            except:
                print(‘craw failed‘)

        while self.urls.has_new_detail_url():
            try:
                detail_url = self.urls.get_detail_url()
                print (‘crow %d : %s‘%(count,detail_url))
                html_cont = self.downloader.download(detail_url)
                soup = self.htmlparser.soup(html_cont)
                dict = self.htmlparser.get_new_data(soup)
                dictdata.update(dict)
                if count == 1000:    #这里先爬取前1000条url的内容
                    break

                count = count + 1
            except:
                print (‘craw failed‘)

        self.outputer.output_excel(dictdata)

#程序入口
if __name__=="__main__":
    url = ‘https://book.douban.com/tag/?view=cloud‘
    obj_spider = SpiderMain()
    obj_spider.craw(url)

  

html_outputer:

# -*- coding:utf8 -*-
import xlwt  #写入Excel表的库

class HtmlOutputer(object):
    def __init__(self):
        self.datas =[]

    def output_excel(self, dict):
        di = dict
        wbk = xlwt.Workbook(encoding=‘utf-8‘)
        sheet = wbk.add_sheet("wordCount")  # Excel单元格名字
        k = 0
        for i in di.items():
            sheet.write(k, 0, label=i[0])
            sheet.write(k, 1, label=i[1])
            k = k + 1
        wbk.save(‘wordCount.xls‘)  # 保存为 wordCount.xls文件  

导出的Excel表格格式为,一共导出15261条记录

make_wordcloud:

# -*- coding:utf8 -*-
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import xlrd
from PIL import Image,ImageSequence
import numpy as np

file = xlrd.open_workbook(‘wordCount.xls‘)
sheet = file.sheet_by_name(‘wordCount‘)
list = {}
for i in range(sheet.nrows):
    rows = sheet.row_values(i)
    tu = {}
    tu[rows[0]]= int(rows[1])
    list.update(tu)
print(list)

image= Image.open(‘./08.png‘)
graph = np.array(image)
wc = WordCloud(font_path=‘./fonts/simhei.ttf‘,background_color=‘white‘,max_words=20000, max_font_size=50, min_font_size=1,mask=graph, random_state=100)
wc.generate_from_frequencies(list)
plt.figure()
# 以下代码显示图片
plt.imshow(wc)
plt.axis("off")
plt.show()

  

背景图片我选用的是

最后的做出由15261本书形成的词云

原文地址:https://www.cnblogs.com/veol/p/8886240.html

时间: 2024-11-08 10:48:29

爬取豆瓣网评论最多的书籍的相关文章

爬取豆瓣网图书TOP250的信息

爬取豆瓣网图书TOP250的信息,需要爬取的信息包括:书名.书本的链接.作者.出版社和出版时间.书本的价格.评分和评价,并把爬取到的数据存储到本地文件中. 参考网址:https://book.douban.com/top250 注意:使用正则表达式时,不要在Elements选项卡中直接查看源代码,因为那的源码可能经过Javascript渲染而与原始请求不同,而是需要从Network选项卡中查看源码. import re import json import time import request

用requests和etree爬取豆瓣电影评论

写在前面的话 :上一篇文章我们用requests和lxml.etree爬取了豆瓣电影Top250的电影信息,为了能对requests和lxml.etree有更深的理解,下面我们将继续用他们来爬取豆瓣电影的短评 温馨提示 :博主使用的系统为win10,使用的python版本为3.6.5 一.网页分析 首先我们使用chrome浏览器打开某一部电影的评论(这里示例为最近很火的<一出好戏>),我们首先可以判断该网站是一个静态网页,和之前一样我们可以通过构造URL来获取全部网页的内容,但是这次我们尝试使

python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法

本文旨在提供爬取豆瓣电影<我不是药神>评论和词云展示的代码样例 1.分析URL 2.爬取前10页评论 3.进行词云展示 1.分析URL 我不是药神 短评 第一页url https://movie.douban.com/subject/26752088/comments?start=0&limit=20&sort=new_score&status=P 第二页url https://movie.douban.com/subject/26752088/comments?sta

爬虫---豆瓣网评论内容

这段时间肯定经常听到一句话“我命由我不由天”,没错,就是我们国产动漫---哪咤,今天我们通过python还有上次写的pyquery库来爬取豆瓣网评论内容 爬取豆瓣网评论 1.找到我们想要爬取的电影---小哪咤 2.查看影片评论 点击查看我们的影评,发现只能查看前200个影评,这里就需要登录了 分析出来全部影评的接口地址 好巧用到了上次写的通过requests登录豆瓣网,然后通过session会话访问评论内容-----post请求登录豆瓣网 # coding:utf-8 import reques

爬虫之爬取豆瓣图书的评论

from urllib import request from bs4 import BeautifulSoup as bs #爬取豆瓣最受关注图书榜 resp = request.urlopen('https://book.douban.com/chart?subcat=I') html_data = resp.read().decode('utf-8') #转化为BeautifulSoup对象 soup = bs(html_data,'html.parser') #搜索最受关注的图书列表 t

[PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索(二)

前情提要:最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台,名字是网盘小说.用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址.就是这么一个简单的功能,类似很多的网盘搜索类网站,我这个采集和搜索程序都是PHP实现的,全文和分词搜索部分使用到了开源软件xunsearch. 上一篇([PHP] 网盘搜索引擎-采集爬取百度网盘分享文件实现网盘搜索)中我重点介绍了怎样去获取一大批的百度网盘用户,这一篇介绍怎样获得指定网盘用户的分享列表.同样的原理,也是找到百度获取分享列表的接口,

python制作爬虫爬取京东商品评论教程

作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计图表,非常的细致,有需要的小伙伴可以参考下 本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D共18个尺寸,以及超过700条的购买评论. 京东商品评论信息是由JS动态加载的,所以直接抓取商品详

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象.同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进行学习.        总之,希望文章对你有所帮助,如果存在不错或者错误的地方,还请海涵~ 一. DOM树结构分析 豆瓣Top250电影网址:https://movie.douban.com/top2

Scrapy 通过登录的方式爬取豆瓣影评数据

Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来比较简单,主要分为以下几步: 1.创建一个项目 ==scrapy startproject Douban 得到一个项目目录如下: ├── Douban │   ├── init.py │   ├── items.py │   ├── pipelines.py │   ├── settings.py