小说网站源码分享自动采集软件 小说阅读网站源码

大家好,关于小说网站源码分享自动采集软件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于小说阅读网站源码的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

用Python探索金庸笔下的江湖!

带你用python看小说,娱乐学习两不误。

涉及的知识点有:

常规小说网站的爬取思路基本的pandas数据整理lxml与xpath应用技巧正则模式匹配Counter词频统计pyecharts数据可视化stylecloud词云图gensim.models.Word2Vec的使用scipy.cluster.hierarchy层次聚类

本文从传统匹配逻辑分析过渡到机器学习的词向量,全方位进行文本分析,值得学习,干货满满。(文末点击阅读原文)

金庸小说的采集

以前金庸小说的网站有很多,但大部分已经无法访问,但由于很多金庸迷的存在,新站也是源源不断出现。我近期通过百度找到的一个还可以访问的金庸小说网址是:aHR0cDovL2ppbnlvbmcxMjMuY29tLw==

不过我已经准备好已经采集完成的数据,大家可以直接下载数据,跳过本章的内容。

数据源下载地址:https://gitcode.net/as604049322/blog_data

每部小说的创作日期

下面首先获取这15部作品的名称、创作年份和对应的链接。从开发者工具可以看到每行的a标签很多,我们需要的节点的特征在于后续临近节点紧接着一个创作日期的字符串:

那么我们就可以通过遍历所有的a标签并判断其后续一个临近节点的内容是否符合日期格式,最终完整下载代码为:

importrequests\nfromlxmlimportetree\nimportpandasaspd\nimportre\n\nheaders={\n&34;:&34;,\n&34;:&34;\n}\nres=requests.get(base_url,headers=headers)\nres.encoding=res.apparent_encoding\nhtml=etree.HTML(res.text)\na_tags=html.xpath(&39;jianjie&34;)\ndata=[]\nfora_tagina_tags:\nm_obj=re.search(&34;,a_tag.tail)\nifm_obj:\ndata.append((a_tag.text,m_obj.group(1),a_tag.attrib[&34;]))\ndata=pd.DataFrame(data,columns=[&34;,&34;,&34;])\n

可以按照创作日期排序查看:

data.sort_values(&34;,ignore_index=True,inplace=True)\ndata\n

名称创作时间网址书剑恩仇录1955年/shujianenchoulu/碧血剑1956年/bixuejian/射雕英雄传1957—1959年/shediaoyingxiongzhuan/神雕侠侣1959—1961年/shendiaoxialv/雪山飞狐1959年/xueshanfeihu/飞狐外传1960—1961年/feihuwaizhuan/白马啸西风1961年/baimaxiaoxifeng/倚天屠龙记1961年/yitiantulongji/鸳鸯刀1961年/yuanyangdao/天龙八部1963—1966年/tianlongbabu/连城诀1963年/lianchengjue/侠客行1965年/xiakexing/笑傲江湖1967年/xiaoaojianghu/鹿鼎记1969—1972年/ludingji/越女剑1970年/yuenvjian/

章节页下载与顺序校正

下面看看章节页节点的分布情况,以《雪山飞狐》为例:

同时可以看到部分小说的节点出现了倒序的情况,我们需要在识别出倒序时将其正序,完整代码:

fromurllib.parseimporturljoin\n\n\ndefgetTitleAndUrl(url):\nurl=urljoin(base_url,url)\ndata=[]\nres=requests.get(url,headers=headers)\nres.encoding=res.apparent_encoding\nhtml=etree.HTML(res.text)\nreverse,last_num=False,None\nfori,a_taginenumerate(html.xpath(&39;cat_box&34;)):\ndata.append([re.sub(&34;,&34;,a_tag.text),a_tag.attrib[&34;]])\nnums=re.findall(&34;,a_tag.text)\nifnums:\niflast_numandint(nums[0])<last_num:\nreverse=True\nlast_num=int(nums[0])\n34;名称==&39;&39;第01章&39;/xueshanfeihu/488.html&39;第02章&39;/xueshanfeihu/489.html&39;第03章&39;/xueshanfeihu/490.html&39;第04章&39;/xueshanfeihu/491.html&39;第05章&39;/xueshanfeihu/492.html&39;第06章&39;/xueshanfeihu/493.html&39;第07章&39;/xueshanfeihu/494.html&39;第08章&39;/xueshanfeihu/495.html&39;第09章&39;/xueshanfeihu/496.html&39;第10章&39;/xueshanfeihu/497.html&39;后记&39;/xueshanfeihu/498.html&34;\\n&34;//div[@class=&39;]/p/text()&34;下载单部小说&34;创建文件:&34;a&34;u8&34;\\n\\n&34;下载:&34;\\n\\n&34;novels&34;novels/{row.名称}.txt&39;novels/{novel}.txt&34;u8&39;data/names.txt&34;utf-8&34;,&39;天龙八部&39;陈家洛&39;张召重&39;徐天宏&39;霍青桐&39;余鱼同&39;文泰来&39;骆冰&39;周绮&39;李沅芷&39;陆菲青&39;袁承志&39;何铁手&39;温青&39;阿九&39;洪胜海&39;焦宛儿&39;皇太极&39;崔秋山&39;穆人清&39;闵子华&39;郭靖&39;黄蓉&39;洪七公&39;黄药师&39;周伯通&39;欧阳克&39;丘处机&39;梅超风&39;杨康&39;柯镇恶&39;杨过&39;小龙女&39;郭靖&39;黄蓉&39;李莫愁&39;郭芙&39;郭襄&39;陆无双&39;周伯通&39;赵志敬&39;胡斐&39;曹云奇&39;宝树&39;苗若兰&39;胡一刀&39;苗人凤&39;刘元鹤&39;陶子安&39;田青文&39;范帮主&39;胡斐&39;程灵素&39;袁紫衣&39;苗人凤&39;马春花&39;福康安&39;赵半山&39;田归农&39;徐铮&39;商宝震&39;李文秀&39;苏普&39;阿曼&39;苏鲁克&39;陈达海&39;车尔库&39;李三&39;丁同&39;霍元龙&39;桑斯&39;张无忌&39;赵敏&39;谢逊&39;张翠山&39;周芷若&39;殷素素&39;杨逍&39;张三丰&39;灭绝师太&39;小昭&39;萧中慧&39;袁冠南&39;卓天雄&39;周威信&39;林玉龙&39;任飞燕&39;萧半和&39;盖一鸣&39;逍遥子&39;常长风&39;段誉&39;萧峰&39;虚竹&39;阿紫&39;乔峰&39;阿朱&39;慕容复&39;王语嫣&39;段正淳&39;木婉清&39;狄云&39;水笙&39;戚芳&39;丁典&39;万震山&39;万圭&39;花铁干&39;吴坎&39;血刀老祖&39;戚长发&39;石破天&39;石清&39;丁珰&39;白万剑&39;丁不四&39;谢烟客&39;闵柔&39;贝海石&39;丁不三&39;白自在&39;令狐冲&39;岳不群&39;林平之&39;岳灵珊&39;仪琳&39;田伯光&39;任我行&39;向问天&39;左冷禅&39;方证&39;韦小宝&39;吴三桂&39;双儿&39;鳌拜&39;陈近南&39;方怡&39;茅十八&39;小桂子&39;施琅&39;吴应熊&39;范蠡&39;阿青&39;勾践&39;薛烛&39;西施&39;文种&39;风胡子&34;name&34;children&34;name&34;value&34;&39;insideTopLeft&39;top&34;金庸小说主角&39;data/kungfu.txt&34;utf-8&39;芙蓉金针&39;柔云剑术&39;百花错拳&39;追魂夺命剑&39;三分剑术&39;八卦刀&39;铁琵琶手&39;无极玄功拳&39;甩手箭&39;黑沙掌&39;雪山剑法&39;金乌刀法&39;碧针清掌&39;五行六合掌&39;梅花拳&39;罗汉伏魔神功&39;无妄神功&39;神倒鬼跌三连环&39;上清快剑&39;黑煞掌&39;七伤拳&39;乾坤大挪移&39;九阳真经&39;玄冥神掌&39;龙爪手&39;金刚伏魔圈&39;千蛛万毒手&39;幻阴指&39;寒冰绵掌&39;真武七截阵&39;六脉神剑&39;生死符&39;凌波微步&39;化功大法&39;北冥神功&39;般若掌&39;火焰刀&39;小无相功&39;天山六阳掌&39;大金刚拳&39;九阴真经&39;铁掌&39;降龙十八掌&39;打狗棒法&39;蛤蟆功&39;空明拳&39;一阳指&39;先天功&39;双手互搏&39;杨家枪法&39;伏虎掌&39;混元功&39;两仪剑法&39;神行百变&39;蝎尾鞭&39;破玉拳&39;金蛇剑法&39;软红蛛索&39;混元掌&39;斩蛟拳&39;玉女素心剑法&39;黯然销魂掌&39;五毒神掌&39;龙象般若功&39;玉箫剑法&39;七星聚会&39;美女拳法&39;天罗地网势&39;上天梯&39;三无三不手&39;辟邪剑法&39;独孤九剑&39;吸星大法&39;紫霞神功&39;易筋经&39;嵩山剑法&39;华山剑法&39;玉女剑十九式&39;恒山剑法&39;无双无对,宁氏一剑&39;连城剑法&39;神照经&39;六合拳&39;胡家刀法&39;苗家剑法&39;龙爪擒拿手&39;追命毒龙锥&39;大擒拿手&39;飞天神行&39;西岳华拳&39;八极拳&39;八仙剑法&39;四象步&39;燕青拳&39;赤尻连拳&39;一路华拳&39;金刚拳&39;毒砂掌&39;四门刀法&39;夫妻刀法&39;呼延十八鞭&39;震天三十掌&39;化骨绵掌&39;拈花擒拿手&39;大慈大悲千叶手&39;沐家拳&39;八卦游龙掌&39;少林长拳&39;金刚护体神功&39;波罗蜜手&39;散花掌&39;金刚神掌&34;name&34;children&34;name&34;value&34;&39;insideTopLeft&39;top&34;金庸高频武功&39;data/bangs.txt&34;utf-8&34;未知&39;红花会&39;言家拳&39;龙门帮&39;天山派&39;嵩阳派&39;南少林&39;雪山派&39;长乐帮&39;侠客岛&39;金乌派&39;摩天崖&39;玄素庄&39;金刀寨&39;明教&39;峨嵋派&39;天鹰教&39;昆仑派&39;龙门镖局&39;崆峒派&39;海沙派&39;巨鲸帮&39;神拳门&39;波斯明教&39;丐帮&39;星宿派&39;灵鹫宫&39;姑苏慕容&39;无量剑&39;逍遥派&39;大理段氏&39;青城派&39;蓬莱派&39;伏牛派&39;桃花岛&39;全真教&39;铁掌帮&39;仙霞派&39;晋威镖局&39;仙都派&39;金龙帮&39;青竹帮&39;渤海派&39;永胜镖局&39;点苍派&39;飞虎寨&39;会友镖局&39;东支&39;千柳庄&39;绝情谷&39;古墓派&39;恒山派&39;华山派&39;嵩山派&39;五岳剑派&39;泰山派&39;衡山派&39;福威镖局&39;日月神教&39;武当派&39;金刀王家&39;血刀门&39;平通镖局&39;饮马川山寨&39;青藏派&39;无极门&39;百会寺&39;韦陀门&39;八卦门&39;天龙门&39;太极门&39;飞马镖局&39;五虎门&39;少林派&39;枫叶庄&39;镇远镖局&39;威信镖局&39;天地会&39;神龙教&39;少林寺&39;清凉寺&39;王屋派&39;铁剑门&39;金顶门&39;武夷派&34;name&34;children&34;name&34;value&34;&39;insideTopLeft&39;top&34;金庸高频门派&34;&34;name&34;门派&34;children&34;radial&34;720px&34;320px&34;&34;right&34;{novel}主角&34;720px&34;320px&34;&34;right&34;{novel}功夫&34;720px&34;320px&34;&34;right&34;{novel}门派&34;天龙八部&去除非中文字符\ntext=re.sub(&34;,&34;,load_novel(&34;))\nwords=[wordforwordinjieba.cut(text)iflen(word)>=4]\nstylecloud.gen_stylecloud(&34;.join(words),\ncollocations=False,\nfont_path=r&39;,\nicon_name=&39;,\noutput_name=&39;)\nImage(filename=&39;)\n

修改上述代码,查看《射雕英雄传》:

神雕侠侣:

主角相关剧情词云

我们知道《神雕侠侣》这部小说最重要的主角是杨过和小龙女,我们可能会对于杨过和小龙女之间所发生的故事很感兴趣。如果通过程序快速了解呢?

我们考虑把《神雕侠侣》这部小说每一段中出现杨过及小龙女的段落进行jieba分词并制作词云。

同样我们只看4个字以上的词:

data=[]\nforlineinload_novel(&34;).splitlines():\nif&34;inlineand&34;inline:\nline=re.sub(&34;,&34;,line)\ndata.extend(wordforwordinjieba.cut(line)iflen(word)>=4)\nstylecloud.gen_stylecloud(&34;.join(data),\ncollocations=False,\nfont_path=r&39;,\nicon_name=&39;,\noutput_name=&39;)\nImage(filename=&39;)\n

这里的每一个词都能联想到发生在杨过和小龙女背后的一个故事。

同样的思路看看郭靖和黄蓉:

data=[]\nforlineinload_novel(&34;).splitlines():\nif&34;inlineand&34;inline:\nline=re.sub(&34;,&34;,line)\ndata.extend(wordforwordinjieba.cut(line)iflen(word)>=4)\nstylecloud.gen_stylecloud(&34;.join(data),\ncollocations=False,\nfont_path=r&39;,\nicon_name=&39;,\noutput_name=&39;)\nImage(filename=&39;)\n

最后我们看看天龙八部的三兄弟相关的词云:

data=[]\nforlineinload_novel(&34;).splitlines():\nif(&34;inlineor&34;inline)and&34;inlineand&34;inline:\nline=re.sub(&34;,&34;,line)\ndata.extend(wordforwordinjieba.cut(line)iflen(word)>=4)\nstylecloud.gen_stylecloud(&34;.join(data),\ncollocations=False,\nfont_path=r&39;,\nicon_name=&39;,\noutput_name=&39;)\nImage(filename=&39;)\n

关系图分析

人物关系分析

金庸小说15部小说中预计出现了1400个以上的角色,下面我们将遍历小说的每一段,在一段中出现的任意两个角色,都计数1。最终我们取出现频次最高的前200个关系对进行可视化。

完整代码如下:

frompyechartsimportoptionsasopts\nfrompyecharts.chartsimportGraph\nimportmath\nimportitertools\n\ncount=Counter()\nfornovelinnovel_names:\nnames=novel_names[novel]\nre_rule=f&39;|&34;\nforlineinload_novel(novel).splitlines():\nnames=list(set(re.findall(re_rule,line)))\nifnamesandlen(names)>=2:\nnames.sort()\nfors,tinitertools.combinations(names,2):\ncount[(s,t)]+=1\ncount=count.most_common(200)\nnode_count,nodes,links=Counter(),[],[]\nfor(n1,n2),vincount:\nnode_count[n1]+=1\nnode_count[n2]+=1\nlinks.append({&34;:n1,&34;:n2})\nfornode,countinnode_count.items():\nnodes.append({&34;:node,&34;:int(math.log(count)*5)+5})\nc=(\nGraph(init_opts=opts.InitOpts(&34;,&34;))\n.add(&34;,nodes,links,repulsion=30)\n)\nc.render(&34;)\n

这次我们生成了HTML文件是为了更方便的查看结果,前200个人物的关系情况如下:

门派关系分析

按照相同的方法分析所有小说的门派关系:

frompyechartsimportoptionsasopts\nfrompyecharts.chartsimportGraph\nimportmath\nimportitertools\n\ncount=Counter()\nfornovelinnovel_bangs:\nbangs=novel_bangs[novel]\nre_rule=f&39;|&34;\nforlineinload_novel(novel).splitlines():\nnames=list(set(re.findall(re_rule,line)))\nifnamesandlen(names)>=2:\nnames.sort()\nfors,tinitertools.combinations(names,2):\ncount[(s,t)]+=1\ncount=count.most_common(200)\nnode_count,nodes,links=Counter(),[],[]\nfor(n1,n2),vincount:\nnode_count[n1]+=1\nnode_count[n2]+=1\nlinks.append({&34;:n1,&34;:n2})\nfornode,countinnode_count.items():\nnodes.append({&34;:node,&34;:int(math.log(count)*5)+5})\nc=(\nGraph(init_opts=opts.InitOpts(&34;,&34;))\n.add(&34;,nodes,links,repulsion=50)\n)\nc.render(&34;)\n

Word2Vec分析

Word2Vec是一款将词表征为实数值向量的高效工具,接下来,我们将使用它来处理这些小说。

gensim包提供了一个Python版的实现。

源代码地址:https://github.com/RaRe-Technologies/gensim官方文档地址:http://radimrehurek.com/gensim/

之前我有使用gensim包进行了相似文本的匹配,有兴趣可查阅:《批量模糊匹配的三种方法》

Word2Vec训练模型

首先我要将所有小说的段落分词后添加到组织到一起(前面的程序可以重启):

importjieba\n\n\ndefload_novel(novel):\nwithopen(f&39;,encoding=&34;)asf:\nreturnf.read()\n\n\nwithopen(&39;,encoding=&34;)asf:\ndata=f.read().splitlines()\nnovels=data[::2]\nnames=[]\nforlineindata[1::2]:\nnames.extend(line.split())\n\nwithopen(&39;,encoding=&34;)asf:\ndata=f.read().splitlines()\nkungfus=[]\nforlineindata[1::2]:\nkungfus.extend(line.split())\n\nwithopen(&39;,encoding=&34;)asf:\ndata=f.read().splitlines()\nbangs=[]\nforlineindata[1::2]:\nbangs.extend(line.split())\n\nfornameinnames:\njieba.add_word(name)\nforkungfuinkungfus:\njieba.add_word(kungfu)\nforbanginbangs:\njieba.add_word(bang)\n\n34;处理:{novel}&34;louis_cha.model&34;louis_cha.model&34;乔峰&34;萧峰&39;段正淳&39;张翠山&39;虚竹&39;赵敏&39;游坦之&39;石破天&39;令狐冲&39;慕容复&39;贝海石&39;钟万仇&34;阿朱&34;蛛儿&39;殷素素&39;赵敏&39;木婉清&39;王语嫣&39;钟灵&39;小昭&39;阿紫&39;程灵素&39;周芷若&39;段誉&34;丐帮&39;恒山派&39;门人&39;天地会&39;雪山派&39;魔教&39;嵩山派&39;峨嵋派&39;红花会&39;星宿派&39;长乐帮&34;降龙十八掌&39;空明拳&39;打狗棒法&39;太极拳&39;八卦掌&39;一阳指&39;七十二路&39;绝招&39;胡家刀法&39;六脉神剑&39;七伤拳&34;段誉&34;段公子&34;{a}-{b}犹如{c}-{d}&34;段誉&34;段公子&34;乔峰&情侣对\nfind_relationship(&34;,&34;,&34;)\n34;令狐冲&34;任我行&34;郭靖&非情侣\nfind_relationship(&34;,&34;,&34;)\n

郭靖-黄蓉犹如杨过-小龙女\n令狐冲-任我行犹如郭靖-黄药师\n郭靖-华筝犹如杨过-郭芙\n

查看韦小宝相关的关系:

34;杨过&34;小龙女&34;韦小宝&34;令狐冲&34;盈盈&34;韦小宝&34;张无忌&34;赵敏&34;韦小宝&34;郭靖&34;黄蓉&34;韦小宝&34;郭靖&34;降龙十八掌&34;黄蓉&34;武当&34;张三丰&34;少林&34;任我行&34;魔教&34;令狐冲&34;name&34;label&34;label&34;类别{label}共{len(names)}个角色,前100个角色有:\\n{&39;.join(names[:100])}\\n&34;name&34;label&34;label&34;类别{label}共{len(names)}个角色,前100个角色有:\\n{&39;.join(names[:100])}\\n&39;font.sans-serif&39;SimHei&39;axes.unicode_minus&34;ward&39;right&39;leaves&39;fontsize&34;ward&39;right&39;leaves&39;fontsize&34;ward&39;right&39;leaves&39;fontsize':12})\nax.set_frame_on(False)\nplt.show()\n

比较少的这一类,基本都是在某几部小说中出现的主要门派,而大多数门派都是打酱油的。

总结

本文从金庸小说数据的采集,到普通的频次分析、剧情分析、关系分析,再到使用词向量空间分析相似关系,最后使用scipy进行所有小说的各种层次聚类。

如果你还想了解更多这方面的信息,记得收藏关注本站。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平