栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

基于python简易小说阅读器(一)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于python简易小说阅读器(一)

基于python简易小说阅读器(一)

实现功能:界面显示小说内容,界面的最下方有按键实现章节切换

  后台需要有小说内容的数据,针对这一块,python的爬虫模块requests可以满足项目需求,前端界面比较简单用python自带的界面模块tkinter即可实现。
  这里先说一下后台的实现,requests模块的安装这里不再赘述,网上一查就有,推荐安装pip模块以后,使用相应的指令下载。
  首先需要下载小说的内容,我们需要得到网页的数据,这里就需要介绍requests模块中的get方法:
  关于requuests模块的get方法,最通常的用法是通过r=request.get(url)构造一个向服务器请求资源的url对象。这个对象是Request库内部生成的。这时候的r返回的是一个包含服务器资源的Response对象。包含从服务器返回的所有的相关资源。相当于此时得到的是一个关于网页的操作句柄。上面用法中的url就是网页的网址,比如我们需要向百度发出请求则url的值是https://www.baidu.com
  既然得到了操作句柄,那接下来就可以得到网页的基本内容了。这时,就要用到text属性了,这个属性可以等到请求网页的内容,以字符串的方式。这里副上其他属性的说明:

import requests  
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
strHtml = requests.get(url)
html = strHtml.text
print(html)

运行代码可以看到

在字符串输出的网页源码中,内容总是在p标签之中, 考虑到这里的网页源码实际上是一大串字符串,所以,要得到小说内容,只需要把p标签中的字符串截取出来就行了。到这,思路基本清晰了,可以把p标签中的字符串分割出来,存入数组/列表中,然后输出数组/列表,就可以看到完整的内容了。 虽然用python基础的字符串分割函数也能实现这个操作,但是,针对网页源码的字符串分割,python有更好用的模块可以实现这个操作,这里使用的是beautifulsoup模块。安装过程这里也不再赘述,建议跟上面安装requests模块一样,用pip指令安装。
  使用beautifulsoup模块的过程与使用requests模块类似,首先是要创建一个beautifulsoup文档对象


接下来就是一直想做的事情了,即分割字符串并取出字符串,塞进容器中。这里要介绍beautifulsoup模块中一个方法——find_all

这个方法参数较多,这里只用到两个参数,分别是name和keyword,name就是标签的名字,比如想得到p标签里的内容,name这个参数在这里的值就是字符p,keyword参数是标签的属性,这里的p标签具体来说,就是class=“content_detail”

import requests  
from bs4 import BeautifulSoup
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
strHtml = requests.get(url)
html = strHtml.text
bf = BeautifulSoup(html,"html.parser")  
texts = bf.find_all('p', class_='content_detail') 
print(texts[0])

该函数会返回一个包含所有搜索结果的列表,这时,运行代码会发现,输出的元素是

没错了,字符串分割已经完成了,但,这个分割不是纯文字的分割,只是把p标签属性是"content_detail"的字符串整块截取出来了。想要得到纯文字的字符串,就要调用text方法了。即:

import requests  
from bs4 import BeautifulSoup
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
strHtml = requests.get(url)
html = strHtml.text
bf = BeautifulSoup(html,"html.parser")  
texts = bf.find_all('p', class_='content_detail') 
print(texts[0].text)

如今,得到内容的所有拼图都已经齐备,是时候得到完整的一页小说的内容了

import requests  
from bs4 import BeautifulSoup
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
strHtml = requests.get(url)
html = strHtml.text
bf = BeautifulSoup(html,"html.parser")  
texts = bf.find_all('p', class_='content_detail') 
lent = len(texts)                                 
for i in range(lent):
    print(texts[i].text)


得到了一页小说的内容,这时就可以着手实现相邻章节内容的切换了

通过观察当前小说网页源码和小说目录以及对比当前页的网址发现,切换章节的网地址由两部分组成,分别是主网页http://m.26ksw.cc和p标签中属性为Readpage中的字符串。所以,只要将p标签中对应的字符串分割出来,加上主网页的网址,自然就能得到相邻章节的完整网址。然后再通过一样的方法得到下一章小说得内容

import requests  
from bs4 import BeautifulSoup
source="http://m.26ksw.cc"
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
chapter = []
i=1
strHtml = requests.get(url,headers=headers)  
html = strHtml.text          
bf = BeautifulSoup(html,"html.parser")  
texts = bf.find_all('p', class_='content_detail') 
print(texts[0].text)
lent = len(texts)                                 
for i in range(lent):
    print(texts[i].text)                          
texts = bf.find_all('p',class_='Readpage')        
bt = BeautifulSoup(str(texts[0]),"html.parser")
a = bt.find_all("a")                             
nextchapter=requests.get(source+a[2].get("href")) 
content = nextchapter.text
bf_1 = BeautifulSoup(content,"html.parser")
texts = bf_1.find_all('p', class_='content_detail')
lent = len(texts)
for i in range(lent):
    print(texts[i].text)

 &emsp通过上面的代码,其实不难看出,得到p标签中部分章节网址的方法与的到小说内容的方法时一样的,即先把p标签属性为Readpage中的字符串整块分割出来,再通过beautifulsoup模块,操作分割出来的字符串,使用get方法得到对应的字符串。值得一提的是,通过上图的网页源码可以看到,章节切换由三个地址,分别是上一章,目录,和下一章,所以,find_all方法返回的列表有三个元素,分别对应上述三个地址,上面a[2]对应的是列表的第三个元素,即下一章的字符串,通过get方法得到a标签中属性是herf的字符串。
 &emsp至此,以及得到了当前页小说得内容以及下一章小说得内容,但是,上述代码运行多几次,可能会得到这样得结果


这是因为通过第三方访问网站得次数太多,网站判断访问为恶意攻击,所以针对访问得IP做出了限制。想要正常访问网站,只需要在requests模块得到网站操作句柄得同时设置浏览器头即可,这样,网站会判断是通过浏览器访问,就不会限制访问了。

import requests  
headers = {
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', 
    'ec-ch-ua':'Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"','ec-ch-ua-mobile':'?0'
}
source="http://m.26ksw.cc"
url = 'http://m.26ksw.cc/book/57659/54059141/2.html'
chapter = []
i=1
strHtml = requests.get(url,headers=headers)  
html = strHtml.text          
bf = BeautifulSoup(html,"html.parser")  
texts = bf.find_all('p', class_='content_detail') 
print(texts[0].text)
lent = len(texts)                                 
for i in range(lent):
    print(texts[i].text)
texts = bf.find_all('p',class_='Readpage')        
bt = BeautifulSoup(str(texts[0]),"html.parser")
a = bt.find_all("a")                              
nextchapter=requests.get(source+a[2].get("href")) 
content = nextchapter.text
bf_1 = BeautifulSoup(content,"html.parser")
texts = bf_1.find_all('p', class_='content_detail')
lent = len(texts)
for i in range(lent):
    print(texts[i].text)
 



  
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/998249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号