python爬虫实践--晋江小说爬取分析

python@ljr

初心:寒假在家看小说,看着看着想自己写,然后申了几次没过,打算把榜单文章拿来好好分析一下,做个高大上的词云看看方向什么的。
但我不会爬虫,只听说过,就上网搜别人的代码,但是别人的代码不满足我的需求,我看不懂也改不了。

python爬虫实践

凭着一口我也是程序人的志气(主要恰好学了python),自己去搜了怎么写爬虫,把视频看了一遍,过了下大概思路,然后看第二遍,注意一些细节,跟着一步一步地做自己的(主要是用他的思路和跟着写一点语句),最后就把晋江上我需要的数据搞出来了。(默默夸一句,beautifulSoup真真真好用)
python爬虫实践--晋江小说爬取分析_第1张图片
总目录
python爬虫实践--晋江小说爬取分析_第2张图片

爬取晋江排行榜

思路,看懂学习视频,自己用那样的思路去解自己想要提取信息的网站。
我也遇到很多问题,查了很多资料,看得头都要秃了,但最后做出来的成就感真的很大。
爬虫的学习视频链接如下:
https://www.bilibili.com/video/BV12E411A7ZQ
老师讲得很清晰很有条理!!(声音很好听,就是没有看到脸。)
代码

# -*- codeding = utf-8 -*-
# @Time : 2021/1/22 14:12
# @Author : ljr
# @File : lx1.py
# @Software : PyCharm

#爬取晋江文学城排行榜前一百的书籍名字,链接,字数

import urllib
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt
import sqlite3

def main():
    baseurl = "http://www.jjwxc.net/bookbase.php?fbsj12=12&ycx1=1&xx1=1&xx2=2&page="
    # 1.爬取网页
    datalist = getData(baseurl)
    print(len(datalist))
    savepath = ".\\晋江小说.xls"
    # dbpath = "book.db"
    # 3.保存数据
    saveData(savepath,datalist)
    # saveDataDb(datalist, dbpath)

#先准备的提取信息内容的正则表达式
findName = re.compile(r'">(.*?)',re.U)
findLink = re.compile(r')
findSize = re.compile(r'(\d+)')

# 1.爬取网页(完成)
def getData(baseurl):
    datalist = []
    for i in range(1,4):    #搜索结果的页数
        url = baseurl + str(i)
        html = askURL(url)
        # 2.逐一解析
        soup = BeautifulSoup(html, "html.parser")
        i = 0
        for item in soup.findAll('tr'):
            data = [] # 保存一本书的所有信息
            item = str(item)
            # 提取文名
            Name = re.findall(findName, item)
            # 提取文章链接
            Link = re.findall(findLink, item)
            # 提取字数
            Size = re.findall(findSize, item)
            if i:
                data.append(Name[1])
                Link[1]='http://www.jjwxc.net/' + Link[1]
                data.append(Link[1])
                data.append(Size[0])
                datalist.append(data)
            i = 1
    return datalist

# 2.得到指定一个URL的网页的内容
def askURL(url):
    head = {
     
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
    }

    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode('GBK')
        # html = response.read()
        # buff = BytesIO(html)
        # f = gzip.GzipFile(fileobj=buff)
        # html = f.read().decode("GBK")
        #这是之前解不开编码时尝试的其它方法
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

# 3.保存数据
# 保存到文件中
def saveData(savepath,datalist):
    workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)
    worksheet = workbook.add_sheet('晋江1', cell_overwrite_ok=True)
    col = ("书名","链接","字数")
    for i in range(0,3):
        worksheet.write(0,i,col[i])
    for i in range(0,len(datalist)):
        data = datalist[i]
        for j in range(0,len(data)):
            worksheet.write(i+1,j,data[j])
    workbook.save(savepath)

'''
# 保存到数据库中
def saveDataDb(datalist, dbpath):
    init_db(dbpath)
    conn = sqlite3.connect(dbpath)
    cur = conn.cursor()

    for data in datalist:
        for index in range(len(data)):
            if index != len(data)-1:
                data[index] = '"' + data[index] + '"'
        sql = "insert into book300(name,link,size) values(%s)"%",".join(data)
        print(sql)
        cur.execute(sql)
        conn.commit()

    cur.close()
    conn.close()
    

# 创建数据库
def init_db(dbpath):
    conn = sqlite3.connect(dbpath)  # 打开或创建一个数据库
    c = conn.cursor()
    sql = """
        create table book300
            (name text primary key not null,
             link text,
             size char(50));"""
    c.execute(sql)
    conn.commit()
    conn.close()
'''



if __name__ == '__main__':
    # 调用函数
    main()

结果
python爬虫实践--晋江小说爬取分析_第3张图片
然后就是做词云分析,统计什么的,我就只想看个词云分析,所以只写了这部分的内容。
代码

# -*- codeding = utf-8 -*-
# @Time : 2021/1/24 19:30
# @Author : ljr
# @File : wcloud.py
# @Software : PyCharm

import sqlite3
import jieba
from matplotlib import pyplot as plt # 绘图,数据可视化
from wordcloud import WordCloud #词云
from PIL import Image   # 图片处理
import numpy as np  #矩阵运算

con = sqlite3.connect("book.db")
cur = con.cursor()
sql = '''
    select name from book300
    '''
data = cur.execute(sql)
text = ""
for item in data:
    text = text + item[0]
# print(text)
cur.close()
con.close()

#拆词
cut = jieba.cut(text)
string = ' '.join(cut)

#生成遮罩
img = Image.open(r'.\flask\static\images\mask.png')
img_array = np.array(img) #将图片转化为数组
wc = WordCloud(
    background_color='white',
    mask = img_array,
    font_path="SIMYOU"
)
wc.generate_from_text(string)

#绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off') # 是否显示坐标轴
# plt.show() # 显示生成的词云图片
#输出词云图片到文件
plt.savefig(r'.\flask\static\images\word.png')

效果
python爬虫实践--晋江小说爬取分析_第4张图片
这个是根据标题中的词语出现频率来做成的,但是大概已经能够确定什么是热标签,写什么题材能够迎合市场,就是穿书,反派,白月光。(我就是确定了这几个哈哈哈,虽然整个寒假什么都没搞出来QAQ。)

爬取文案

基本思路就是先随便找一本书点进链接,然后在这个链接中把自己想要的信息提取出来处理一下。
最后再添加变量,让它遍历你第一步提取出来的文章链接,通过这个链接的变化就可以把每一本书的信息自动提取出来了。(感觉很多地方的模式都是重复的,只是变量上的区别,所以在代码中处理一下变量就可以实现大量系统的重复工作)
目录
python爬虫实践--晋江小说爬取分析_第5张图片
代码

# -*- coding = utf-8 -*-
# @Time : 2021/1/25 18:17
# @Author : ljr
# @File : cw.py
# @Software : PyCharm
# 提取文案,存放到excel中,看文案可以快速知道文章大概的情节和人设,爽点萌点等
# 提取标签,做一个词云,掌握市场
import urllib
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt
import xlrd
from xlutils.copy import copy
import gzip
from io import BytesIO

findCopywrite = re.compile(r'
(.*?)
'
, re.U) #findLable = re.compile(r'(.*?)') #findSize = re.compile(r'(\d+)') def main(): savepath = "晋江小说.xls" sheetname = "文案" #1.得到需要爬取的文章页面的列表 data = geturl(savepath,sheetname) #data = [['ha','o '],['http://www.jjwxc.net/onebook.php?novelid=4790493','http://www.jjwxc.net/onebook.php?novelid=4954901']] # 2.爬取网页 datalist = getData(data) print(len(datalist)) # 3.保存数据 saveData(savepath,sheetname, datalist) print("存储完成") # saveDataDb(datalist, dbpath) #1.打开文件得到需要爬取的列表 def geturl(savepath,sheetname): url = [] name = [] data = [] rb = xlrd.open_workbook('晋江小说.xls', formatting_info=True) rs = rb.sheet_by_name("晋江1") for i in range(1, 100): row_data = rs.row_values(i) data.append(row_data) for i in range(len(data)): name.append(data[i][0]) url.append(data[i][1]) data = [name, url] return data # 爬取网页(完成) def getData(data): datalist = [] for i in range(len(data[1])): url=data[1][i] Lable = [] copywrite = [] print('开始爬取网页:',url) try: html = askURL(url) except (ValueError, OSError) as es: continue else: # 2.逐一解析 soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('td',class_='readtd'): item = str(item) # 提取文案 copywrite.append(re.findall(findCopywrite, item)) # 提取标签 for item in soup.find_all('a',style = "text-decoration:none;color: red;",target = "_blank" ): Lable.append(item.get_text()) datalist.append([data[0][i],copywrite[0],Lable]) print(datalist) return datalist # 得到指定一个URL的网页的内容(完成) def askURL(url): head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) # html = response.read().decode('GBK') html = response.read() buff = BytesIO(html) f = gzip.GzipFile(fileobj=buff) html = f.read().decode("gbk") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html def saveData(savepath,sheetname, datalist): # open existing workbook rb = xlrd.open_workbook(savepath, formatting_info=True) # make a copy of it wb = copy(rb) # add sheet to workbook with existing sheets worksheet = wb.add_sheet(sheetname) col = ("书名", "文案","标签") for i in range(0, 3): worksheet.write(0, i, col[i]) i = 1 for data in datalist: worksheet.write(i, 0, data[0]) worksheet.write(i, 1, data[1]) worksheet.write(i, 2, data[2]) i = i + 1 wb.save(savepath) if __name__ == '__main__': # 调用函数 main()

效果:python爬虫实践--晋江小说爬取分析_第6张图片

其它想法

想统计下文章中出现的形容词、副词、常用句式什么的,看看那些大火的书有没有 什么共同的规律,人家都用了什么叙事手法,什么梗,什么事件顺序。
下面是继续用jieba拆分整本书的词:
目录:
python爬虫实践--晋江小说爬取分析_第7张图片
代码:

# -*- coding = utf-8 -*-
# @Time : 2021/1/25 19:29
# @Author : ljr
# @File : article.py
# @Software : PyCharm

# 用jieba统计处理文章中所有的词语,做词云或者存到excel中都可以
import jieba
import xlwt
import xlrd
from xlutils.copy import copy

def main():
    filepath = r'《君子有九思》.txt'
    cstring = []
    counts = {
     }
    savepath = r'晋江小说.xls'
    sheetname = r'《君子有九思》'
    # 1.打开文件
    text = readtext(filepath)
    # 2.提取词语
    cstring = extractwords(text)
    # 3.统计频率
    counts = wordcount(cstring)
    # 4.存放到excel中
    saveData(savepath, sheetname, counts)

# 读取文本数据
def readtext(filepath):
    fp = open(filepath, 'r', encoding='gbk', errors='ignore')
    text = fp.read()
    # print(text)
    fp.close()
    return text

# 用jieba分词进行处理
def extractwords(text):
    jieba.load_userdict(r'word.txt')
    jieba.add_word('老婆粉')
    jieba.add_word('乔瞧')
    jieba.add_word('霍希')
    jieba.add_word('盛乔')
    cstring = jieba.lcut(text)
    # string = ' '.join(cut)
    # print(cstring)
    return cstring

# 统计词频
def wordcount(cstring):
    counts = {
     }     # 通过键值对的形式存储词语及其出现的次数
    #
    s = open("baidu_stopwords.txt", encoding='utf-8', errors="ignore")
    baidu_stop = []
    for word in s:
        word = word.strip()
        baidu_stop.append(word)
    #
    for word in cstring:
        if len(word) == 1:    # 单个词语不计算在内
            continue
        else:
            counts[word] = counts.get(word, 0) + 1    # 遍历所有词语,每出现一次其对应的值加 1
    items = list(counts.items())    # 将键值对转换成列表
    items.sort(key=lambda x: x[1], reverse=True)    # 根据词语出现的次数进行从大到小排序
    # 去除停用词
    for temp in items:
        if temp[0] in baidu_stop:
            items.remove(temp)
    s.close()
    return items   #返回一个字典
    # print(items)

# 将item写入excel
def saveData(savepath,sheetname, datalist):
    # open existing workbook
    rb = xlrd.open_workbook(savepath, formatting_info=True)
    # make a copy of it
    wb = copy(rb)
    # add sheet to workbook with existing sheets
    worksheet = wb.add_sheet(sheetname)
    col = ("词语", "次数")
    for i in range(0, 2):
        worksheet.write(0, i, col[i])
    i = 1
    for data in datalist:
        worksheet.write(i, 0, data[0])
        worksheet.write(i, 1, data[1])
        i = i + 1
    wb.save(savepath)

if __name__ == "__main__":
    main()

但是结果,emmm(大声喊:这不是我想要的!!这个统计出来有毛用啊!!!):
python爬虫实践--晋江小说爬取分析_第8张图片
我想统计真正用人类思维去理解拆分这个句子,让它是个完整的意思,这个结果明显不符合期待,于是继续搜资料,搜到了机器学习的部分。
于是想学机器学习把这个事情解决了,emmm,然后发现自己的力量太弱小,搞不定机器学习。
哎!(技术小白菜沉重地叹一口气)

感想

其实做了这么多,最后也还没有接近真正能创造价值那一步(就是写出能赚钱的小说),所以计算机/计算机语言都只是工具,要做成真正有效的事需要一环扣一环的努力。

你可能感兴趣的:(python,python,数据分析)