用Python給女票寫一個小說網站

前排打個廣告:

快畢業要找工作了!

有沒有南京的小夥伴幫忙內推一下Python相關的崗位

開始的原因

女票愛看小說,最近沉迷一個小說論壇:91baby

每次都要打開瀏覽器進十分復古的網頁里看

效果大概是這樣的:

?我覺得這樣效果實在是有點差

就開始寫一個小說網站給她用

基本思路

主要用爬蟲獲取原網站的小說數據

之後排版後顯示在一個新的網頁里

其實沒有什麼難度

主要想和大家分享一個開源項目:Toapi

項目主頁里寫了一句話:Every web site provides APIs.

數據部分 :Toapi

Toapi 是一個開源項目, 可以快速將一個網站的數據整理變成可調用的api介面,將數據最終以json的形式返回

地址: github.com/gaojiuli/toa

下面我來展示一下簡單的使用:

91baby為例,我們需要解析小說的:

  • 名字
  • 內容
  • 作者
  • 鏈接

其實就是解析論壇的列表頁、詳情頁

在Toapi的框架里

每項需要解析的數據都可以用一個item來表示

所以我們只需要定製好解析頁面的規則

剩下的都可以交給框架來處理

解析列表頁

class HotBook(Item):n # 需要解析的欄位n __base_url__ = http://91baby.mama.cnn title = XPath(//a[@class="xst"]/text()[1])n author = XPath(//a[@class="xst"]/text()[1])n url = XPath(//a[@class="xst"]/@href)n book_id = XPath(//a[@class="xst"]/@href)nn # `clean__xxx`方法是用來進一步格式化信息用的n def clean_title(self, title):n if in title:n return title[title.find() + 1:title.find()][:10]n else:n return 廣告貼nn def clean_author(self, author):n if : in author:n return author[author.find(:) + 1:author.find(()]n elif in author:n return author[author.find() + 1:author.find()]n else:n return 廣告貼nn def clean_book_id(self, book_id):n return book_id.split(-)[1]nn class Meta:n source = XPath(//tbody[@class="thread_tbody"])n # 定義路由 左邊是我們內網的url,右邊是源站的urln # 比如 我們訪問 www.api.url/hotbook?page=1 n # 框架就會向 www.xxx.com/form-171-1.html 發送請求n route = {/hotbook?page=:page: /forum-171-:page.html}n

解析書籍詳情

class Book(Item):n __base_url__ = http://91baby.mama.cnn title = XPath(//*[@id="wp"]/div[3]/text()[3])n author = XPath(//*[@id="wp"]/div[3]/text()[3])n total_page = XPath(//span[@class="pgt"]/div//a)n contents = XPath(//td[@class="t_f"])nn def clean_title(self, title):n return title.split()[1].split()[0]nn def clean_author(self, author):n index = author.find(作者:) + 3n return author[index:]nn def clean_contents(self, contents):n text = []n for item in contents:n content = strip(item.xpath(string(.)))n if len(content) < 128:n text.append(全書完結!!! 以下的內容是網友書評!)n text.append(content)n return textnn def clean_total_page(self, total_page):n try:n for index, page in enumerate(total_page):n num = page.xpath(./text())[0]n if num == 下一頁:n i = int(index) - 1n breakn page = total_page[i].xpath(./text())[0]n if ... in page:n return int(page.replace(... , ))n return int(page)n except:n return 1nn class Meta:n source = Nonen route = {/book_id=:id?page=:page: /thread-:id-:page-1.html}n

測試是否可以用

# Toapi 的入口nfrom toapi import Apinfrom items.hotbook import HotBooknfrom items.book import Booknfrom settings import MySettingsnnapi = Api(, settings=MySettings)napi.register(HotBook)napi.register(Book)nif __name__ == __main__:n api.serve()n n# 運行程序n# python app.pyn

這下,當我們訪問:http://127.0.0.1:5000/hotbook?page=1

就可以得到91baby論壇第一頁書籍數據了

並且數據會json的形式返回,方便我們調用

{n "HotBook": [n {n "title": "廣告貼",n "author": "廣告貼",n "url": "http://91baby.mama.cn/thread-1502279-1-1.html",n "book_id": "1502279"n },n {n "title": "廣告貼",n "author": "廣告貼",n "url": "http://91baby.mama.cn/thread-1502414-1-1.html",n "book_id": "1502414"n },n}n

用命令行展示的效果:

?

網頁web部分

數據部分處理好了,剩下的就是web頁面的搭建了

由於我是前端苦手,就網上找了一套別人開源寫好的模板

效果大概是這樣的:

?

配合追書神器的api還能顯示其他分類的小說

?

閱讀界面是這樣的

?

最後

由於沒錢買域名 也沒功夫去備案

網站就跑在騰訊雲學生伺服器上

由於上面還跑著其他很多測試程序

我就不把網站放出來給大家玩了

偷偷給我女票一個人用就行

每天的學習記錄都會 同步更新到:

微信公眾號: findyourownway

知乎專欄:zhuanlan.zhihu.com/Ehco

Blog : www.ehcoblog.ml

GitHub: github.com/Ehco1996/Pyt


推薦閱讀:

爬取的數據怎麼保存為圖片?
156個Python網路爬蟲資源,媽媽再也不用擔心你找不到資源!
自學python3的爬蟲,但是網上普遍是python2的書,想問下有沒有好的爬蟲的python3書?

TAG:Python | python爬虫 | 小说 |