python实例:自动爬取豆瓣读书短评,分析短评内容

思路:

1、打开书本“更多”短评,复制链接

2、脚本分析链接,通过获取短评数,计算出页码数

3、通过页码数,循环爬取当页短评

4、短评写入到txt文本

5、读取txt文本,处理文本,输出出现频率最高的词组(前X)----通过分析得到其他结果可自由发散

用到的库:

lxml 、re、jieba、time

整个脚本如下

# -*-coding:utf8-*-
# encoding:utf-8
#豆瓣每页20条评论

import requests
from lxml import etree
import re
import jieba
import time

firstlink = "https://book.douban.com/subject/30193594/comments/"

def stepc(firstlink):#获取评论条数
    url=firstlink
    response = requests.get(url=url)
    wb_data = response.text
    html = etree.HTML(wb_data)
    a = html.xpath('//*[@id="total-comments"]/text()')
    return(a)
a=stepc(firstlink)
c=re.sub(r'\D', "", a[0])#返回评论数筛选数字
d=int(int(c)/20+1)#通过评论数计算出页码数,评论数/20+1
print("当前评论有"+ str(d) +"页,请耐心等待")


def stepa (firstlink,d):#读取评论内容
    content=[]
    for page in range(1,d):
        url=firstlink+"hot?p"+str(page)
        response = requests.get(url=url)
        wb_data = response.text
        html = etree.HTML(wb_data)
        a = html.xpath('//*[@id="comments"]//div[2]/p/span/text()')
        content.append(a)
    return(content)
a=stepa (firstlink,d)

def stepb(a):#写入txt
    for b in a:
        for c in b:
            with open('C:/Users/Beckham/Desktop/python/2.txt', 'a',encoding='utf-8') as w:
                w.write('\n'+c)
                w.close()
stepb(a)
print("完成评论爬取,接下来分析关键字")
time.sleep(5)

def stepd():#分析评论
    txt=open("C:\\Users\\Beckham\\Desktop\\python\\2.txt","r", encoding='utf-8').read()    #打开倚天屠龙记文本
    exculdes={}   #创建字典,主要用于存储非人物名次,供后面剔除使用
    words=jieba.lcut(txt)   #jieba库分析文本
    counts={}
    for word in words:    #筛选分析后的词组
        if len(word)==1:   #因为词组中的汉字数大于1个即认为是一个词组,所以通过continue结束点读取的汉字书为1的内容
            continue
        else:
            word=word
        counts[word]=counts.get(word,0)+1  #对word出现的频率进行统计,当word不在words时,返回值是0,当rword在words中时,返回+1,以此进行累计计数
    for word in exculdes:#如果循环读取到的词组与exculdes字典内的内容匹配,那么过滤掉(不显示)这个词组
        del(counts[word])
    items=list(counts.items())#字典到列表
    items.sort(key=lambda x:x[1],reverse=True)#lambda是一个隐函数,是固定写法,以下命令的意思就是按照记录的第2列排序    
    for i in range(15):#显示前15位数据
        word,count=items[i]
        print("{0:<10}{1:>10}".format(word,count)) #0:<10左对齐,宽度10,”>10"右对齐
stepd()       
print("分析完成")

执行结果

 

 

需要注意的是,如果频繁执行这个脚本,豆瓣会认为ip访问过多,弹出需要登录的页面

 

 其他解析,在脚本内有注释

 

posted @ 2019-08-31 20:32  小贝书屋  阅读(1641)  评论(0编辑  收藏  举报