小说有广告?我用50行Python爬虫做了一个无广在线小说阅读器
小說有廣告?我用50行Python爬蟲做了一個(gè)無廣在線小說閱讀器
- 前言
- 介紹
- 正文
- 預(yù)配置
- 搜索
- 獲取章節(jié)列表
- 在線閱讀
- 總結(jié)
前言
還在為看小說受到廣告影響而煩惱嗎?不如利用起時(shí)間,跟著本文一起入門python爬蟲,實(shí)現(xiàn)小說自由!
介紹
本項(xiàng)目的全部?jī)?nèi)容包括:
1.搜索功能實(shí)現(xiàn)
2.根據(jù)所選小說爬取全部章節(jié)列表
3.在線閱讀所選章節(jié)
正文
預(yù)配置
在一般的無反爬蟲情形下,python請(qǐng)求網(wǎng)頁信息的請(qǐng)求頭較為簡(jiǎn)單,只寫User-Agent項(xiàng)即可,可在檢查中任意請(qǐng)求的請(qǐng)求頭中查看
配置代碼如下:
上段代碼中使用了session會(huì)話機(jī)制,可有效提升python的requests訪問網(wǎng)站速度
搜索
在小說網(wǎng)站搜索萬相之王,檢查網(wǎng)絡(luò)元素
發(fā)現(xiàn)其請(qǐng)求的url如上圖中所示,其中的searchkey即為搜索文字的url編碼
分析網(wǎng)頁源碼可知,我們所需的書名和鏈接均位于class屬性值為grid的table標(biāo)簽中,使用xpath語法即可提取標(biāo)簽內(nèi)容和標(biāo)簽屬性
綜上,這一部分輸入書名搜索返回結(jié)果的代碼如下:
獲取章節(jié)列表
打開任意一本書籍,檢查加載書籍章節(jié)時(shí)的網(wǎng)絡(luò)訪問情況
可以發(fā)現(xiàn)請(qǐng)求的地址就是我們上一步中得到的書籍url,進(jìn)一步證實(shí)了想法
在這里我們發(fā)現(xiàn)所有章節(jié)名稱和url信息全部位于網(wǎng)頁源碼的dd標(biāo)簽中,同上,利用xpath語法提取
這一部分獲取章節(jié)名字的代碼如下:
在線閱讀
我們打開任意一章小說,審查網(wǎng)絡(luò)元素
同樣可以發(fā)現(xiàn)所請(qǐng)求的網(wǎng)站就是上一步中得到的章節(jié)地址
在網(wǎng)頁源碼中我們發(fā)現(xiàn)小說正文部分位于id屬性為content的div標(biāo)簽中,編寫代碼提取正文內(nèi)容:
到此,我們已經(jīng)掌握了整個(gè)小說閱讀的來龍去脈
總結(jié)
整個(gè)網(wǎng)絡(luò)小說在線閱讀類封裝如下:
import requests from 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('//div[@class="box_con"]/div[@id="list"]//a/@href')self.chapTitles = html.xpath('//div[@class="box_con"]/div[@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('//div[@class="content_read"]//div[@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在此基礎(chǔ)上我們稍作修飾,用PyQt5為其開發(fā)一個(gè)可視化面板,最終效果如圖:
總結(jié)
以上是生活随笔為你收集整理的小说有广告?我用50行Python爬虫做了一个无广在线小说阅读器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 类型转换方法_java数据类型
- 下一篇: pythonif语句的多分支使用_Pyt