python爬虫小说在线阅读

通过网页看小说经常会有广告弹窗,而网上的教程大多是下载小说。所以我做了个可以通过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里面。

再通过iteams2内的网址就能转换到小说页面。

(3)小说文本的输出

def xiaoshuo(url3):#小说文本的输出
    xs = requests.get(url3)
    xs.encoding = 'utf-8'
    XS = xs.text
    pattern3 ='&nbsp;&nbsp;&nbsp;&nbsp;(.*?)<br'
    iteams3 = re.findall(pattern3,XS)
    for a3 in iteams3:
         print(a3)

跳转到小说页面:


对小说内容右键选择检查,就能捕获到文字对应的网页信息。

小说文字内容的re模块正则表达式如下:
pattern3 ='&nbsp;&nbsp;&nbsp;&nbsp;(.*?)<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)

这只是小说阅读的框架,功能还不完善。其他功能在后续添加。

小说搜索无结果以及小说搜索后的翻页。

目录会有重章或断章,所以需要进行章节的搜索。

程序返回上一级菜单功能。

直接进入小说最新章节。

小说进入下一章或上一章。

小说的自动翻页功能。

以上功能将会在后续逐渐补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值