最近很多人关心小说有广告 我用50行Python爬虫做了一个无广在线小说阅读器这个话题,卢子百科整理了小说有广告 我用50行Python爬虫做了一个无广在线小说阅读器相关内容,希望对大家有用。

前言

还在为看小说受到广告影响而烦恼吗?不如利用起时间,跟着本文一起入门python爬虫,实现小说自由!

介绍

本项目的全部内容包括:

1.搜索功能实现

2.根据所选小说爬取全部章节列表

3.在线阅读所选章节

正文预配置

在一般的无反爬虫情形下,python请求网页信息的请求头较为简单,只写User-Agent项即可,可在检查中任意请求的请求头中查看

配置代码如下:

def __init__(self):self._headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.55"}self._search_url = 'https://www.xbiquwx.la/modules/article/search.php?searchkey='self._book_url = 'https://www.xbiquwx.la'self.session = requests.session()

上段代码中使用了session会话机制,可有效提升python的requests访问网站速度

搜索

在小说网站搜索万相之王,检查网络元素

发现其请求的url如上图中所示,其中的searchkey即为搜索文字的url编码

分析网页源码可知,我们所需的书名和链接均位于class属性值为grid的table标签中,使用xpath语法即可提取标签内容和标签属性

综上,这一部分输入书名搜索返回结果的代码如下:

def search(self, name:str):if name:response = self.session.get(url = self._search_url name,headers = self._headers)html = etree.HTML(response.content.decode())self.bookID = html.xpath('//table[@class="grid"]/tr/td[@class="odd"]/a/@href')bookNameTag = html.xpath('//table[@class="grid"]/tr/td[@class="odd"]/a')self.bookName = [item.text for item in bookNameTag]return self.bookName获取章节列表

打开任意一本书籍,检查加载书籍章节时的网络访问情况

可以发现请求的地址就是我们上一步中得到的书籍url,进一步证实了想法

在这里我们发现所有章节名称和url信息全部位于网页源码的dd标签中,同上,利用xpath语法提取

这一部分获取章节名字的代码如下:

def chapLists(self, index:int):response = self.session.get(url = self._book_url self.bookID[index],headers = self._headers)self.index = indexhtml = etree.HTML(response.content.decode())self.chapUrls = html.xpath('//p[@class="box_con"]/p[@id="list"]//a/@href')self.chapTitles = html.xpath('//p[@class="box_con"]/p[@id="list"]//a/@title')self.chapUrls.reverse()self.chapTitles.reverse()return self.chapTitles在线阅读

我们打开任意一章小说,审查网络元素

同样可以发现所请求的网站就是上一步中得到的章节地址

在网页源码中我们发现小说正文部分位于id属性为content的p标签中,编写代码提取正文内容:

def read(self, index:int):response = self.session.get(url = self._book_url self.bookID[self.index] self.chapUrls[index],headers = self._headers)code = response.apparent_encodinghtml = etree.HTML(response.content.decode())articleRaw = html.xpath('//p[@class="content_read"]//p[@id="content"]')a0 = etree.tostring(articleRaw[0],encoding=code).decode(code)a2 = a0[32:-29]article = "<h1>" self.chapTitles[index] "</h1>" '<font size="5"><br />' a2 "</font>"return article

到此,我们已经掌握了整个小说阅读的来龙去脉

总结

整个网络小说在线阅读类封装如下:

import requestsfrom lxml import etreeclass bqCrawler():def __init__(self):self._headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.55"}self._search_url = 'https://www.xbiquwx.la/modules/article/search.php?searchkey='self._book_url = 'https://www.xbiquwx.la'self.session = requests.session()def search(self, name:str):if name:response = self.session.get(url = self._search_url name,headers = self._headers)html = etree.HTML(response.content.decode())self.bookID = html.xpath('//table[@class="grid"]/tr/td[@class="odd"]/a/@href')bookNameTag = html.xpath('//table[@class="grid"]/tr/td[@class="odd"]/a')self.bookName = [item.text for item in bookNameTag]return self.bookNamedef chapLists(self, index:int):response = self.session.get(url = self._book_url self.bookID[index],headers = self._headers)self.index = indexhtml = etree.HTML(response.content.decode())self.chapUrls = html.xpath('//p[@class="box_con"]/p[@id="list"]//a/@href')self.chapTitles = html.xpath('//p[@class="box_con"]/p[@id="list"]//a/@title')self.chapUrls.reverse()self.chapTitles.reverse()return self.chapTitlesdef read(self, index:int):response = self.session.get(url = self._book_url self.bookID[self.index] self.chapUrls[index],headers = self._headers)code = response.apparent_encodinghtml = etree.HTML(response.content.decode())articleRaw = html.xpath('//p[@class="content_read"]//p[@id="content"]')a0 = etree.tostring(articleRaw[0],encoding=code).decode(code)a2 = a0[32:-29]article = "<h1>" self.chapTitles[index] "</h1>" '<font size="5"><br />' a2 "</font>"return article

在此基础上我们稍作修饰,用PyQt5为其开发一个可视化面板,最终效果如图: