用Python給女票寫一個小說網站
前排打個廣告:
快畢業要找工作了!
有沒有南京的小夥伴幫忙內推一下Python相關的崗位
開始的原因
女票愛看小說,最近沉迷一個小說論壇:91baby
每次都要打開瀏覽器進十分復古的網頁里看
效果大概是這樣的:
?我覺得這樣效果實在是有點差
就開始寫一個小說網站給她用基本思路
主要用爬蟲獲取原網站的小說數據
之後排版後顯示在一個新的網頁里
其實沒有什麼難度
主要想和大家分享一個開源項目:Toapi項目主頁里寫了一句話:Every web site provides APIs.數據部分 :Toapi
Toapi 是一個開源項目, 可以快速將一個網站的數據整理變成可調用的api介面,將數據最終以json的形式返回
地址: https://github.com/gaojiuli/toapi
下面我來展示一下簡單的使用:
以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
{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知乎專欄:https://zhuanlan.zhihu.com/Ehco-pythonBlog : www.ehcoblog.mlGitHub: https://github.com/Ehco1996/Python-crawler推薦閱讀:
※爬取的數據怎麼保存為圖片?
※156個Python網路爬蟲資源,媽媽再也不用擔心你找不到資源!
※自學python3的爬蟲,但是網上普遍是python2的書,想問下有沒有好的爬蟲的python3書?