通过网页看小说经常会有广告弹窗,而网上的教程大多是下载小说。所以我做了个可以通过CMD看小说的程序。
纯属兴趣爱好,菜的一批,大神勿喷。如有不懂,点击打开链接全能解决
这里用到python爬虫最简单的两个库:requests和re
我看小说选择的网站是顶点小说网:http://www.23us.so/ 可自行更改网站
(1)首先,要做到在网页内搜索小说。
譬如搜索 :龙王传说 跳转后网址:http://zhannei.baidu.com/cse/search?s=8053757951023821596&q=龙王传说
翻到第二页 网址为:http://zhannei.baidu.com/cse/search?q=龙王传说&p=1&s=8053757951023821596
通过分析url可得知 q= 后是所搜索的书名 而 &p= 后是搜索后网页的页数
import requests
import re
def shousuo(s1,S1):#搜索模块,s1 书名 S1页码
S1 = str(S1)#将数字转换成字符型
url1 = 'http://zhannei.baidu.com/cse/search?s=5513259216532962936&entry=1&q=' + s1 +'&p='+ S1+'&s=5513259216532962936&entry=1'
shousuo = requests.get(url1)
shousuo.encoding = 'utf-8'#将网页转换成utf—8
Shousuo = shousuo.text#将网页转换成文本形式
pattern1 = '<a cpos="title" href="(.*?)" title="(.*?)" class="result-game-item-title-link" target="_blank">'
iteams1 = re.findall(pattern1, Shousuo)
for a1 in iteams1:
print('书名:' + a1[1] + ' 网址:' + a1[0])
return iteams1
现在需要对页面信息进行爬取,我用谷歌浏览器,视图如下:
对书名右键选择检查,就能捕获到书名对应的网页信息。
<a cpos="title" href="http://www.23us.so/files/article/html/12/12700/index.html" title="龙王传说" class="result-game-item-title-link" target="_blank">
<em>龙王</em><em>传说</em>
</a>
通过捕获到的信息,我们可以发现 小说名称以及对应的网址。
用re模块正则表达式进行筛选
pattern1 = '<a cpos="title" href="(.*?)" title="(.*?)" class="result-game-item-title-link" target="_blank">'
iteams1 = re.findall(pattern1, Shousuo)
(.*?)就是所需的内容,保存在iteams1这个列表里。
iteams1内保存着当前页面内所有的小说名称以及对应的网址。
通过print将iteam1内的信息以文字显示出来。
再将iteam1取出放到下一个模块,进行小说章节的选择。
(2)小说章节的选取
def mulu(url2):#目录 url2 搜索书的网址
ml = requests.get(url2)
ml.encoding = 'utf-8'
ML = ml.text
pattern2 = '<td class="L"><a href="(.*?)">(.*?)</a>'
iteams2 = re.findall(pattern2, ML)
for a2 in iteams2:
print('章节:' + a2[1] + ' 网址:' + a2[0])
return iteams2
通过iteam1内存储的网址会跳转到以下这个页面:
对章节右键选择检查,就能捕获到章节对应的网页信息。
<td class="L"><a href="http://www.23us.so/files/article/html/12/12700/4884609.html">第一章 觉醒日</a></td>
同样,用re模块正则表达式进行筛选:
pattern2 = '<td class="L"><a href="(.*?)">(.*?)</a>'
iteams2 = re.findall(pattern2, ML)
再通过iteams2内的网址就能转换到小说页面。
(3)小说文本的输出
def xiaoshuo(url3):#小说文本的输出
xs = requests.get(url3)
xs.encoding = 'utf-8'
XS = xs.text
pattern3 =' (.*?)<br'
iteams3 = re.findall(pattern3,XS)
for a3 in iteams3:
print(a3)
跳转到小说页面:
对小说内容右键选择检查,就能捕获到文字对应的网页信息。
小说文字内容的re模块正则表达式如下:
pattern3 =' (.*?)<br'
iteams3 = re.findall(pattern3,XS)
再对iteams3进行输出,小说文章就能显示出来了。
(4)小说的功能模块已经完成,进行书名输入以及小说选择以及章节选择。
while 1:
print('请输入书名:')
s1 =input() #书名
S1 = 0 #默认搜索的第一页
ITEAM1 = shousuo(s1=s1, S1=S1) #运行shousuo模块并将搜索结果iteams1传给ITEAM1
print('请选择书:')
s2 = input()
url2 = ITEAM1[int(s2)-1][0] #要将s2转换成int类型,其次数列是由0开始,第一本网址为ITEAM1[0][0]
ITEAM2 = mulu(url2=url2) #运行mulu模块并将搜索结果iteams2传给ITEAM2
print('请选择章节:')
s3 = input()
url3 = ITEAM2[int(s3)-1][0] #同上
print(ITEAM2[int(s3)-1][1]) #输出章节名称
xiaoshuo(url3=url3) #输出小说文本
说明都注释在程序后面。
完整程序:
import requests
import re
def shousuo(s1,S1):#搜索模块,s1 书名 S1页码
S1 = str(S1)#将数字转换成字符型
url1 = 'http://zhannei.baidu.com/cse/search?s=5513259216532962936&entry=1&q=' + s1 +'&p='+ S1+'&s=5513259216532962936&entry=1'
shousuo = requests.get(url1)
shousuo.encoding = 'utf-8'#将网页转换成utf—8
Shousuo = shousuo.text#将网页转换成文本形式
pattern1 = '<a cpos="title" href="(.*?)" title="(.*?)" class="result-game-item-title-link" target="_blank">'
iteams1 = re.findall(pattern1, Shousuo)
for a1 in iteams1:
print('书名:' + a1[1] + ' 网址:' + a1[0])
return iteams1
def mulu(url2):#目录 url2 搜索书的网址
ml = requests.get(url2)
ml.encoding = 'utf-8'
ML = ml.text
pattern2 = '<td class="L"><a href="(.*?)">(.*?)</a>'
iteams2 = re.findall(pattern2, ML)
for a2 in iteams2:
print('章节:' + a2[1] + ' 网址:' + a2[0])
return iteams2
def xiaoshuo(url3):#小说文本的输出
xs = requests.get(url3)
xs.encoding = 'utf-8'
XS = xs.text
pattern3 =' (.*?)<br'
iteams3 = re.findall(pattern3,XS)
for a3 in iteams3:
print(a3)
while 1:
print('请输入书名:')
s1 =input()
S1 = 0
ITEAM1 = shousuo(s1=s1, S1=S1)
print('请选择书:')
s2 = input()
url2 = ITEAM1[int(s2)-1][0]
ITEAM2 = mulu(url2=url2)
print('请选择章节:')
s3 = input()
url3 = ITEAM2[int(s3)-1][0]
print(ITEAM2[int(s3)-1][1])
xiaoshuo(url3=url3)
这只是小说阅读的框架,功能还不完善。其他功能在后续添加。
小说搜索无结果以及小说搜索后的翻页。
目录会有重章或断章,所以需要进行章节的搜索。
程序返回上一级菜单功能。
直接进入小说最新章节。
小说进入下一章或上一章。
小说的自动翻页功能。
以上功能将会在后续逐渐补充