日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

小说有广告?我用50行Python爬虫做了一个无广在线小说阅读器

發(fā)布時(shí)間:2023/12/10 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小说有广告?我用50行Python爬虫做了一个无广在线小说阅读器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小說有廣告?我用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)求頭中查看
配置代碼如下:

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會(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é)果的代碼如下:

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

獲取章節(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é)名字的代碼如下:

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('//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.chapTitles

在線閱讀

我們打開任意一章小說,審查網(wǎng)絡(luò)元素

同樣可以發(fā)現(xiàn)所請(qǐng)求的網(wǎng)站就是上一步中得到的章節(jié)地址

在網(wǎng)頁源碼中我們發(fā)現(xiàn)小說正文部分位于id屬性為content的div標(biāo)簽中,編寫代碼提取正文內(nèi)容:

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('//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

到此,我們已經(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。