用Python寫過哪些「腦洞大開」的小工具?

只用Python寫個網路爬蟲工具,是個CSDN博客下載工具。

因為公司網路限制,上網都是間接上的,坑爹啊。。所以看好的博客系列性的文章,又沒辦法隨時想看就看,一篇一篇保存又太慢,所以就花了點時間,用python寫了這個博客爬蟲工具,爬取博主的所有博客

附Github鏈接:Kevinsss/csdn-spider · GitHub


腦洞 1 :知乎帶逛網站

之前曾抓取過知乎的一些數據(已經停掉了,現在不做任何爬蟲了),然後通過一個演算法,自動判斷一個回答是否是美女爆照回答(通過文字、圖片比,問題下所有回答帶圖比,答案評論、問題評論文本相似度等十多條規則),並將爆照回答的圖片聚合到一個網站 zhihu.photo,由於已經停掉了,截圖如下:

腦洞 2 :微博自動報時

我的微博(http://weibo.com/duxu0805)之前會每小時自動發布一條微博,附帶一張壁紙圖片和一個鏈接,鏈接是微博附圖的高清無水印版下載地址。

腦洞 3 :得到知乎上兩人的關係圖

為了找到在輪子哥、四萬姐的關注鏈上游有沒有我,將知乎用戶的關係鏈畫了一張很大的有向圖,並得到如下結果:

關於實現,可以參考我的博客:http://xlzd.me/2016/01/31/python-crawler-09

腦洞 4 :認識一下我的工資所處水平

為了找到我的工資在互聯網行業處於一個什麼水平,通過拉勾的幾十萬招聘數據重新認識了自己的水平。

結論如下:從拉勾招聘看互聯網行業

腦洞 5 :不想動,用樹莓派吧

還在上學的時候,寒假在家。晚上躺在沙發看電視,睡前 20 分鐘需要去打開電熱毯,不想動,就用樹莓派、繼電器和 Python 實現了一個郵件控制電熱毯通電、斷電的程序,睡前 20 分鐘發一封郵件,電熱毯就開了。

腦洞 6 :知乎用戶整體概況

不多贅述,請直接看博客吧:一個知乎重度用戶眼中的知乎

腦洞 7 :各式各樣的爬蟲

大到1024 / GitHub ,小到妹子圖,各式各樣的網站基本全部抓過了,曾經聚合過一個網站,由於不喜歡喝茶,也停了。

腦洞 8 :face知乎

通過關鍵詞檢索知乎用戶,包括但不限於性別、地域、個人描述等。

其它

用 Python 做了好多好多事情,暫時想到這些值得分享的,如果想起來,再繼續更新出來吧~


為什麼知乎不支持markdown語言

---

破百了就更新

---

這貨叫做 樹莓派鏡子

他其實是由原子鏡+LCD屏幕+樹莓派+木頭盒子 組成的

我們先來說原子鏡

原子鏡的學名其實叫做 單向透視玻璃,但是在淘寶上搜 原子鏡 這個關鍵詞會好些

單面鏡其實是「雙面鏡」,單面鏡前後兩面的光學性質根本沒有分別,它之所以能產生單面反光的效果,完全是因為鏡的兩面處於不同光度的環境所造成的。我們先比較普通鏡子和單面鏡的結構。普通鏡子是把銀鍍在玻璃上製成的。單面鏡也一樣,可是在鍍銀時就只會鍍「一半」。怎樣可以鍍「一半」呢?方法倒是有點巧妙:鍍上去的銀(不是真銀,是其他金屬)十分薄,使一半的光可以通過,另一半就被反射回去。在實際使用時,犯人會面向鏡面,而且身處有強光的房間。因為光線充足,反射的光較多,犯人便會在鏡中看見自己的影象。此時證人站在鏡的另一邊,一個光線很微弱的房間里。雖然證人房間里部分的光線也可以穿過單面反光鏡,但由於光度很低,所以犯人便看不到證人,只能看到自己的影像。情形就好像在街燈的強光下,我們不能看見螢火蟲一樣,因為來自螢火蟲的微弱光線被街燈的光所蓋過了。因此所謂單面反光的現象,只是視覺上的錯覺罷了! (摘自百度百科)

原子鏡廣泛應用於監獄、公檢法機構審訊室、精神病醫院、大學科研機構研究室、大型會議室等,可達到裡面看不到外面,外面可看到裡面的效果。

比如 審訊室

還有外國人的街頭公廁

這種廁所上起來感受應該比較刺激

當然還有應用於酒(tou)店(pai)的,所以在網上也有很多賣小尺寸的原子鏡,一般是10x10cm的一塊10塊錢,我這個是12x14cm的也是10塊錢,但是郵費就要20,所以很划不來,據說現在有種單透膜,可以達到同樣的效果,沒有研究過。

接下來說 LCD屏幕

我使用的是深圳微雪公司出的4英寸LCD屏,這個屏幕用起來很方便,直接插起來就可以用

正面

反面

和樹莓派合體

效果

這塊屏幕更詳盡的介紹

然後樹莓派

感覺這貨沒什麼好說的,大家應該都知道,稍微說一下

這是一個迷人有趣的Linux電腦

樹莓派(為學生計算機編程教育設計的一種卡片式電腦)編輯 Raspberry Pi(中文名為「樹莓派」,簡寫為RPi,或者RasPi/RPi)是為學生計算機編程教育而設計,只有信用卡大小的卡片式電腦,其系統基於Linux。 隨著Windows 10 IoT的發布,我們也將可以用上運行Windows的樹莓派。 自問世以來,受眾多計算機發燒友和創客的追捧,曾經一「派」難求。別看其外表「嬌小」,內「心」卻很強大,視頻、音頻等功能通通皆有,可謂是「麻雀雖小,五臟俱全」。

樹莓派由註冊於英國的慈善組織「Raspberry Pi 基金會」開發,Eben·Upton/埃·厄普頓為項目帶頭人。2012年3月,英國劍橋大學埃本·阿普頓(Eben Epton)正式發售世界上最小的台式機,又稱卡片式電腦,外形只有信用卡大小,卻具有電腦的所有基本功能,這就是Raspberry Pi電腦板,中文譯名"樹莓派"。這一基金會以提升學校計算機科學及相關學科的教育,讓計算機變得有趣為宗旨。基金會期望這 一款電腦無論是在發展中國家還是在發達國家,會有更多的其它應用不斷被開發出來,並應用到更多領域。在2006年樹莓派早期概念是基於Atmel的 ATmega644單片機,首批上市的10000「台」樹莓派的「板子」,由中國台灣和大陸廠家製造。

樹莓派名字中的pi其實指的就是 python

所以我選擇了 python 作為 鏡子的編程語言

那麼說說我用python在這上面幹了些什麼

事實上最開始我的策略使用一個全屏的網頁瀏覽器顯示一個 黑底白字 的網站

可是坑爹的是 我更不不會web技術

然後我就打算要不試試python吧,本來還覺得不爽又要新學一門語言

但是

python給我很大的驚喜

我並沒有學習python的語法,而是看了兩個例子就直接使用tkinter庫開始編程

這就是python的優勢: 簡單

接觸python到用tk寫出第一個的界面,只用了1個小時的時間

就是一開始那個環形顯示時間那個

對於准大一新生來說,不管是python的語法還是庫的使用都很容易,所以python很適合用來入門

我甚至打算教我的女朋友(nue)(gou)

接著我結合百度的天氣API,pm2.5API等開發了一些其他界面

所有的界面都是黑底白字。

我覺得鏡子展現的內容就應該簡潔,所以界面上只有 數字 文字 線條 3個元素

後來我覺得只是這樣太死氣了

所以我開發了一個類,能讓這些元素擁有動畫效果,並且能讓 Pm2.5 天氣 時間 我和女朋友在一起了多少秒 等等 這些信息能夠隨機的在鏡子上淡入淡出

最後我想,如果一定要跟鏡子交互,那麼語音應該是最好的選擇,不然就是用智能手機鏈接鏡子

我是比較偏向語音這個選擇,因為這將會是一種新式的交互體驗,就跟童話里的魔鏡一樣,我對這個鏡子的定位是一個外形比較騷的公眾信息聚合平台,所以語音相對於手機來說,更方便,而對於這樣一個定位來講,方便很重要,試想你在酒店想要找廁所,然後你問魔鏡 』魔鏡魔鏡,廁所在哪『 是不是比掏出手機鏈結魔鏡,然後再用某種低效的輸入進行交互方便的多?

再說百度等都有開放的API可以用何樂而不為?

所以下一步的目標就是把語音的功能開發出來,目前卡在了語音採集這個問題上。

還希望大神多指教

停更


添了點說明

---------------------------

- #### 更新一個

有年狂風暴雨,就是風很大雨很大,我一直很關注天氣,就爬了氣象網站的氣象雷達圖,然後做成gif。此圖中間十字坐標是常州機場的氣象雷達位置,探測範圍是半徑230公里,每5分鐘更新一次,紅色就是暴雨,非常準確,下面的圖是去年7月份一段24小時內的gif圖。

查看GIF動畫 https://pic1.zhimg.com/v2-e88b033ea6a52584eeb0732efd6f9cb8_b.gif

監視考勤機(中控考勤機,有sdk),每天打卡滿10個人,通過微信企業號廣播考勤排行前10;

中控考勤機sdk可以讀取考勤記錄,也可以註冊實時消息,我是用的前者,9點01分讀取所有記錄,取前10,然後用微信企業號api發一個文本消息,很簡單。以前單位搞某個系統的註冊活動,我調用考勤機實時消息介面,每人一打卡,都可以立即收到一條信息,把註冊鏈接發到手機上,不註冊就天天發,上班發,下班發。

每天9:00,自動發消息給未打卡的人,告訴他們:嘿,你遲到了。

後來看到一個微信機器人,就把機器人放到微信群,用來發同事的開門禁請求(我們門口有攝像機,門上有個二維碼,拍一下會拍照,然後機器人把連接發群里,看到人打開頁面,如果的確是同事,就點開門,挺好玩的,但後來行政不允許這樣搞,就關了)

海康威視威視的攝像機有個英文版的開發手冊,很全面,調用拍照就是get一個鏈接。門上的二維碼就是一個URL,微信掃描後會向flask發送一個get請求,然後python就去攝像機get一個照片,同時生成一個隨機數,用於本次開門簡單驗證,開門也是中控的門禁,買了個串口繼電器接門禁輔助按鈕聯動開門,python通過串口控制繼電器,微信機器人忘記是什麼的,就是當年用來驗證朋友圈多少好友刪了自己的那個(當時不是用的itchat),都很簡單,當時就是覺得好玩。

還通過路由器api監視老闆手機wifi,一旦老闆進入公司,自動連接wifi後,就滴滴滴發消息給預定的人,哈哈

愛快的路由器,不記得是通過api還是模擬登錄後刷在線用戶了,只記得返回json數據。

還寫過一個通過辦公室監控(海康威視高清監控)來監視飲水機的紅燈和綠燈來提醒我水開了沒,但效果不好,因為有人會移動飲水機

用的pil庫,攝像機抓拍截圖,截取固定區域圖片,然後比對顏色,但是經常有人動飲水機,就放棄了

學爬蟲寫過發貼機和別人互懟被封ip後學會掛代理被封后,學會了投票機,在媽媽群很受歡迎(什麼萌寶大賽,萌寵大賽等),後來大家都開始驗證微信號了,沒得玩了

這個還賺了點小錢,參考過好像是知乎上的一篇文章,如何維護一個代理庫,也是從當時,把httplib2換成了requests

爬某不可描述網站,爬了網站所有用戶id,然後跑了弱密碼,獲得幾千個id,也不知道幹啥,然後用這幾千個id來贊自己的貼,最後自己id被封

這個論壇pc版登錄有驗證碼,但是他自帶手機版入口,沒有驗證碼,所以可以跑弱口令,最常見的弱口令123456,111111數量之多,遠超我的想像。

爬過本地電梯信息(我們這每個電梯有一個編號,掃二維碼,可以獲取電信維保信息),然後統計了下過保電梯,發到本地知名論壇,居然沒人關心。。。

電梯id是按順序排列的,一大堆的電梯過保了,唉

在工地寫過小程序來監視消防crt(就是消防控制櫃的外接電腦系統)的access資料庫,發現報警就發微信,但被維保單位告知,別瞎搞。。。想想也對,萬一出事可是沒事找事

樓下火鍋店有個活動,就是每天微信會上幾次菜的照片(有不同的菜,我喜歡吃蝦和毛肚),然後可以在微信上搶,搶到了就可以免費吃,我寫了個程序監視,如果出現毛肚或蝦,就直接把連接發到我微信,輸入驗證碼就能搶到,幾天時間搶到了6份,叫上朋友一頓吃光。後來就變成抽獎了,就沒再去吃過

這個就是靠菜名關鍵詞,蝦和毛肚,沒有什麼圖片識別之類。

我不是IT行業,但python的確帶給我很多樂趣,因為其他編程語言我都不會:)


程序已更新(請點擊下面的鏈接查看):

如何使用素描圖生成器?

  • 素描圖生成器 使用手冊
  • 素描圖生成器 開發代碼
  • 素描圖生成器 簡單介紹

代碼GitHub地址:

  • https://github.com/liujiachao/sumiao

下載:

Windows 7/8/10 64位操作系統 鏈接:http://pan.baidu.com/s/1kUDFJG7 密碼:s5s2

-----------------------------------這是老版本的分界線-----------------------------------------------------------

為了逃避學校布置的美術作業,寫過一個畫素描的程序。

從後再也不擔心美術作業了。

也就是利用Python的PIL庫來 將彩色圖片轉化為素描效果的圖片

更新說明:

前面那個程序寫的太粗糙了,不好意思拿出來分享,重新寫了一遍,加上了GUI圖形界面。

配置環境:

windows 10
python 3.5

image.py

from PIL import Image
import numpy as np
import os
import join
import time
def image(sta,end,depths=10):
a = np.asarray(Image.open(sta).convert("L")).astype("float")
depth = depths # (0-100)
grad = np.gradient(a) # 取圖像灰度的梯度值
grad_x, grad_y = grad # 分別取橫縱圖像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A
vec_el = np.pi / 2.2 # 光源的俯視角度,弧度值
vec_az = np.pi / 4. # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az) # 光源對x 軸的影響
dy = np.cos(vec_el) * np.sin(vec_az) # 光源對y 軸的影響
dz = np.sin(vec_el) # 光源對z 軸的影響
b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) # 光源歸一化
b = b.clip(0, 255)
im = Image.fromarray(b.astype("uint8")) # 重構圖像
im.save(end)

def mains(numbers):
number = int(numbers)
startss = os.listdir(".輸入----圖片")
time.sleep(2)
for starts in startss:
start = "".join(starts)
print("正在轉化--圖片: " + start)
sta = "./" + "輸入----圖片/" + start
end = "./" + "輸出----圖片/" + "HD_20" + start
image(sta=sta,end=end,depths=number)

簡單來說,就是利用python的Numpy庫,將圖像降維轉化為數字化的數據,之後對數據進行操作,再利用pillow庫將操作好的數據轉化為素描效果的圖片。

GUI圖形界面程序

main.py

import os
from image import mains
from tkinter import *

def exists_mkdir():
if os.path.exists("輸出----圖片") and os.path.exists("輸入----圖片"):
pass
else:
os.mkdir("輸出----圖片")
os.mkdir("輸入----圖片")

def images():
try:
s1 = e1.get()
a = mains(s1)
c["text"] = "我們的程序運行成功了"
except Exception:
c["text"] = "程序運行出錯了,可能是缺少了兩個配置文件"

#創建程序運行需要的工作目錄
exists_mkdir()

tk = Tk()
# 設置窗口大小和位置
tk.geometry("430x350+80+60")

# 不允許改變窗口大小
tk.resizable(False, False)

## 用來顯示Label組件
tk.title("素描圖生成器")
w1 = Label(tk,text="作者博客:www.liuchaoblog.live")
w = Label(tk,text="")
w2 = Label(tk,text="歡迎使用:")
w3 = Label(tk,text="步驟一:將需要轉化的圖片放入 輸入----圖片 文件夾下")
w4 = Label(tk,text="步驟二:輸入 0-100的數值,數值越大,顏色越深。--------標準參數是 10 ")
w5 = Label(tk,text="步驟三:點擊確認 運行程序 等待出現提示")
w6 = Label(tk,text="步驟四:到輸入----圖片 文件夾找到素描圖")
w1.grid(row=0,column=0,sticky=W)
w.grid(row=1,column=0,sticky=W)
w2.grid(row=2,column=0,sticky=W)
w3.grid(row=3,column=0,sticky=W)
w4.grid(row=4,column=0,sticky=W)
w5.grid(row=5,column=0,sticky=W)
w6.grid(row=6,column=0,sticky=W)

l = Label(tk,text="輸入 0-100的數值")
l.grid(row=8,column=0,sticky=E)

## 用來顯示輸入框
e1 = Entry(tk)
e1.grid(row=10,column=0,sticky=E)

## 用來顯示Button
b = Button(tk,text="確定",command=images)
b.grid(row=12,column=0,sticky=E)

c = Label(tk,text="",background="yellow")
c.grid(row = 15)

# 啟動消息主循環
tk.mainloop()

運行效果:

這個程序我用pyinstaller做成exe文件了。

程序和代碼都在 鏈接:http://pan.baidu.com/s/1mir4SWw 密碼:dabm

程序實在簡陋,對於一個大一計算機小白已經儘力了,請原諒它。

發現Bug/有建議可以直接告訴我,感激不盡。覺得有收穫就點了讚唄。

小白寫文章,如有錯誤請指出,感激不盡。

個人博客網站:here 歡迎訪問。

說明:

不能說全是我寫的,這個程序是我學習了 http://www.icourse163.org/learn/BIT-1001870002?tid=1001963001 這個課程之後寫出來的,感謝老師的課程,有些想法和思路參考了課程老師的,模仿老師的思路寫出來的,雖然代碼是自己寫的,但是思路是模仿老師的,應該不能算完全原創吧。


造數 - 新一代智能雲爬蟲,今天教大家寫一個遊戲,馬里奧

可以用Python來寫遊戲啊!

作為一個從小就愛玩遊戲的孩紙,小時候對遊戲最深的印象就是魂斗羅、超級瑪麗,一不小心就暴露年齡了。最近發現GitHub上一個非常Nice的項目,使用Pygame來寫了一個超級瑪麗

地址:justinmeister/Mario-Level-1

遊戲試玩

多的不說,來體驗試試,下載

git clone https://github.com/justinmeister/Mario-Level-1.git

開始:有兩種開始遊戲的方法,執行py文件或者exe文件
按鍵:A:跳躍、S:火球/加速、 鍵盤上的左右鍵控制方向
依賴:Pygame 1.9.1 (Python 2)、Pygame 1.9.2 (Python 3)

可以選擇一人遊戲還是兩人遊戲

「Enter」開始遊戲,響起了熟悉的音樂,右上角有時間記錄

可以看到,這款遊戲和以前玩的基本一致,包括畫面、音樂、成長等等。因為目前作者只寫了第一關,所以過了第一關就會顯示「GAME OVER」。

然我們看看源碼中的文件, data目錄下是遊戲運行的代碼,resources則是遊戲運行的資源,字體、圖片、音樂等。

代碼欣賞

超過時間,遊戲結束,作者是這樣寫的

class GameOver(LoadScreen):
"""A loading screen with Game Over"""
def __init__(self):
super(GameOver, self).__init__()

def set_next_state(self):
"""Sets next state"""
return c.MAIN_MENU

def set_overhead_info_state(self):
"""sets the state to send to the overhead info object"""
return c.GAME_OVER

def update(self, surface, keys, current_time):
self.current_time = current_time
self.sound_manager.update(self.persist, None)

if (self.current_time - self.start_time) &< 7000: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) elif (self.current_time - self.start_time) &< 7200: surface.fill(c.BLACK) elif (self.current_time - self.start_time) &< 7235: surface.fill((106, 150, 252)) else: self.done = True class TimeOut(LoadScreen): """Loading Screen with Time Out""" def __init__(self): super(TimeOut, self).__init__() def set_next_state(self): """Sets next state""" if self.persist[c.LIVES] == 0: return c.GAME_OVER else: return c.LOAD_SCREEN def set_overhead_info_state(self): """Sets the state to send to the overhead info object""" return c.TIME_OUT def update(self, surface, keys, current_time): self.current_time = current_time if (self.current_time - self.start_time) &< 2400: surface.fill(c.BLACK) self.overhead_info.update(self.game_info) self.overhead_info.draw(surface) else: self.done = True

創建當馬里奧觸摸旗杆時出現的點

def create_flag_points(self):
"""Creates the points that appear when Mario touches the
flag pole"""
x = 8518
y = c.GROUND_HEIGHT - 60
mario_bottom = self.mario.rect.bottom

if mario_bottom &> (c.GROUND_HEIGHT - 40 - 40):
self.flag_score = score.Score(x, y, 100, True)
self.flag_score_total = 100
elif mario_bottom &> (c.GROUND_HEIGHT - 40 - 160):
self.flag_score = score.Score(x, y, 400, True)
self.flag_score_total = 400
elif mario_bottom &> (c.GROUND_HEIGHT - 40 - 240):
self.flag_score = score.Score(x, y, 800, True)
self.flag_score_total = 800
elif mario_bottom &> (c.GROUND_HEIGHT - 40 - 360):
self.flag_score = score.Score(x, y, 2000, True)
self.flag_score_total = 2000
else:
self.flag_score = score.Score(x, y, 5000, True)
self.flag_score_total = 5000

遊戲設計元素

作者還錄製了視頻 https://www.youtube.com/watch?v=HBbzYKMfx5Y

還有一個mini-RPG,justinmeister/The-Stolen-Crown-RPG

同樣基於Python和Pygame

Python做遊戲開發不只是Pygame一個庫,還有下面超贊的遊戲開發庫。

  • Cocos2d:cocos2d 是一個用來開發 2D 遊戲, 示例和其他圖形/交互應用的框架。基於 pyglet。官網
  • Panda3D:由迪士尼開發的 3D 遊戲引擎,並由卡內基梅隴娛樂技術中心負責維護。使用C++編寫, 針對 Python 進行了完全的封裝。Free 3D Game Engine
  • PyOgre:Ogre 3D 渲染引擎的 Python 綁定,可以用來開發遊戲和模擬程序等任何 3D 應用。PyOgre
  • PyOpenGL:OpenGL 的 Python 綁定及其相關 APIs。PyOpenGL -- The Python OpenGL Binding
  • PySDL2:SDL2 庫的封裝,基於 ctypes。Welcome to PySDL2』s documentation!
  • RenPy:一個視覺小說(visual novel)引擎。The Renamp;#x27;Py Visual Novel Engine

造數 - 請一定要關注最好用的!!!新一代智能雲爬蟲


更新:

我已經用更好的演算法做了更細緻的分析:用 Python 分析《紅樓夢》

======================================

用後綴樹找出《紅樓夢》中的單詞,並且生成一段《紅樓夢》風格的文字。

緣起是我之前看到了一篇分析紅樓夢詞頻並判斷前八十回和後四十回的作者是否為同一個人的專欄文章(沒收藏,所以忘了是哪篇文章了)。文章的作者用的是「結巴分詞」這個庫來分割單詞的。我想,這樣半文半白的小說要是現代文的分詞模型來進行分詞,準確性應該不會很高。於是我就有完全根據紅樓夢原文來統計詞頻的想法。然後我就想到了後綴樹,因為後綴樹可以很快速地找出字元串中重複的部分,而單詞一般都會重複出現。

當然,單詞一般會重複出現,但是重複出現的不一定都是單詞,還有可能是上一個單詞的後半部分和下一個單詞前半部分的組合,或者只是完整單詞的一部分。所以,在構造後綴樹以後,我還設計了一些規則來把不像單詞的內容過濾掉。如果一個「單詞」的前面經常出現同樣的內容,那麼這一項很可能只是一個完整單詞的後半部分,因此會被去掉。又如,如果一個「單詞」出現的次數相對較少,那麼很可能只是巧合導致的重複,也會被去掉。這個過程剛好能利用上後綴樹里的後綴鏈,因此非常快速。經過這樣的處理之後,生成的單詞表裡奇怪的內容就少了很多。

實際的規則還要略微複雜一些,比如「出現次數相對較少」的判斷標準,會結合單詞前半部分出現次數以及單詞與後面文字的組合情況進行計算。當時嘗試各種計算方法以及閾值的時候也花了不少時間。

然而這個演算法還是太簡單了,因此還會不小心過濾掉一些真的單詞,也會留下一些不是單詞的內容。另外,程序經常把片語也當成單詞,不過只是生成單詞表的話,把片語留下也未嘗不可。雖然有這些問題,但是感覺效果還是可以的。

最後,我把程序的輸出做成了一個網頁版的單詞表,以供瀏覽:紅樓詞表

(流量黨注意,此網頁未經優化,每次點擊內鏈的時候都會重新載入網頁,請慎點。主目錄大小是 0.2 MB,一級展開後 1.5MB,二級展開後 3.3MB。)

單詞表中括弧前面的內容是單詞,括弧中數字的意義如下。

第一個數字:和該單片語合的字中僅出現過一次的組合有多少個。

第二個數字:和該單片語合的字的個數加上該單詞位於句尾的次數。

第三個數字:該單詞出現的總次數。

組合是指單詞後面緊跟著一個字。

=============分割線=============

除了這個以外,這個後綴樹還能做更有意思的事情:隨機生成紅樓夢風格的文本。我的想法是,如果把《紅樓夢》的用詞按照《紅樓夢》里常用的組合方式拼接起來,那麼會不會產生一段很有《紅樓夢》風格的文字呢?

具體的思路就是,先隨機選擇第一個單詞,然後在原文里檢索這個單詞後面經常出現的內容,從這些選項里隨機選一個加到結果里。之後,再取結果的最後幾個字元作為檢索關鍵詞,再檢索後面經常出現的內容,隨機選一個選項,以此類推。候選項被選中的概率和出現的頻率正相關。如果候選項太少,則去掉檢索關鍵詞的第一個字,也就是縮短檢索關鍵詞再檢索。這個演算法剛好也能用上後綴鏈,因此速度也非常快。

最後生成的文本風格確實比較像,然而內容根本不成章。這也是意料之中的,畢竟被程序考慮的上下文只有前面幾個字。我隨便生成了幾個 400 字的段落,大家可以感受一下:

家裡上上下下都藏著二爺外頭的事他不得,賈政慌慌的眾人一見了寶玉,因此二爺回來再來看你,然後按次名,越發不知道,問道,你這話說的倒也罷了,他們姊妹們別笑話,賈母便向平兒道,我也怕起來,鳳求鸞,賈璉聽說,忙站起來,一面說,一面就碰在他家去,你們就不吃了,玉釧兒道,你不用忙,這話雖有賈母笑道,大家明日就要起身道,我也怕黛玉便說道,你回去說了,叫我們過來,二人都打聽,一個個不知道,你要不然,你不管,只得又轉念一首,你是個明白人,何必作了,心中自是喜悅,只單留下襲人進來,見是賈璉道,你到底把這兩天,寶玉道,你不知道這些作速死後總不過挨次便叫襲人來,我還有事,只怕他不成,李紈忙轉眼錯不見就可笑,等著呢,那一個又病著,不然,你有多少話,可是我親也是一定要人,早知這樣,那一年我在這屋裡熬的話,又是親戚,那也不盛妝蟒各上不大理會他母女兩個人,都是你們有事故人,不知怎麼弄些時,必定是這兩個人也都來了,賈母道,

說話兒,說著,便要打要哭,賈政早已不像這個傻子,若是你們沒聽見這些話,叫人來說道,我方才到了怡紅院,一共十九日子,所以老爺要到各自去罷,賈政即忙進去,將來難,這是叫我,他怎麼樣,你就認真了這裡,也有說該題,原來這小娼婦走來,只見李紈迎接著問是誰,二奶奶說了,好了,寶玉便笑道,這倒是正禮,眾人便欲要拷問道,我聽見說,怎麼倒大奶奶,說道,這是那裡的話,正說著,只聽外間聽這話有法子,你說好了,豈不是不可因我們想不到這裡,覺得心些就是了,又有什麼,若是老太太和姑娘的,周瑞家常,連忙進來,只見焙茗道,阿彌陀佛,真是茄子,我是個小丫頭進來,給我一個人走了,說著,便又往賈母處來,正在不知不覺將小人兒,晴雯,又讓坐著,我也沒有別的事,我就不敢言語,只是傻笑,又不敢笑,又不敢笑,這話怎麼樣呢,賈政道,他早拿些來,平兒笑道,我自有一定的,也有說他們不知,這個又鬧起,那裡有那樣個香袋,誰和我也不敢言語,只見賈環

不敢說,我就吃了兩杯酒,放下心自賈璉就些乾淨,只見紫鵑在外頭原是我們的造化了,便問道,姑娘喝起來了,因此大家敘,便笑道,這才好呢,平兒道,那邊有人叫,寶玉忙道,有個原故,說著,就有一宗,你們自己房中,彼時他的舊病來,賈母等聽了點頭兒,紫鵑連忙爬起來,大家吃著,撞,接過一小心,再不敢回,向來不知怎麼樣呢,我想來,寶玉道,這怕什麼,等我回去,自己不肯去,林家的那些人,一時,來至賈珍之患,原來這賈母王夫人處回來,把這些出來,眾媳婦上來,賈母道,這個名兒的話,老太太放心,就是我的,好姐姐,給你個,就在他身上,說道,沒有吃了,我們這起這些事來,因說道,你們兩個人是個好的,我也不好意思,不時拿他出氣,沒有,眾人不解,只說好了,今日忽見丫頭來說不是一件,再去罷,說著,大家都笑了,寶玉道,我這裡正要告訴老太太不知道,薛姨媽又一個丫頭,好了歌,不料他竟不得已是掌燈時分,因問,什麼要緊,不過略有玉的事,你且把

我有什麼事,便說道,我的姐姐,你也不用說話,寶玉聽了,嚇了一跳,問他們去,說著,命賈蓉答應,賈璉聽到這樣,怎麼不該,也不枉你們鬧去罷,回來你成了人,我忙笑道,這有個原故,我須得先回來回道,今日你來的好,寶玉道,這是第二天氣和暖,這可不是,我原不要折死了,你打諒老太太的事上還是一首七言律詩,你告訴我們一聲兒,便十分殷勤小心,也便宜,寶玉本是個聰明女婿打,賈政因你們那裡就知道了,賈母道,我不料我們竟是一個小丫頭子,外間門口,只見一個小廝,必是後話,也不好怎麼想來,是,又命小丫頭子的,只不知干,你們還不來,右等也不管了,你還要叫他打官司,所以知又是可惜這也奇了,你去罷,賈蓉忙亦非常,只得趕至次日,寶玉因說道,我有一句心裡的話,也不知誰叫你來的,寶玉道,我那裡是沒個空兒,就說是寶蟾葯死他的後事,寶玉道,一面說,一面脫身自己死了我也不知是什麼人,鳳姐笑道,你這會子又跑了這裡來,你也不用說了,只和我一

原是我們的造化,該罰,但不知老太太怎麼不知,我自然不敢叫將至外書房,那些小姐們,倒不如死了乾淨,我想這件事怎麼辦,我怕他不依,便將賈環便知,寶玉聽了,笑道,這個不難,等我化了來,先就好的,寶玉道,我這裡現在病的病,雖有一個兒子們便說,要往後退,說道,那裡的話,正說著,賈母又叫他們聽聽,我那一處好,寶玉道,我也不知道,就是你的親事,今日這樣的話,昨夜之事,不用說這些不好了,連忙起身笑說,不相干,那麼些日子,什麼事,寶玉道,我屋裡來,你們只管作詩,寶玉在傍看著那起人家,這些女孩子們,便如今怎麼說,黛玉,湘雲笑道,快說,管你什麼,從此以後,他為是,賈政道,依你怎麼不來回老祖宗,你若不回去的,只是這十來年紀未知是誰,下回分解,大觀園,到了你不成,寶釵道,可惜這麼大了,連忙迎上來說,太爺不在這裡,他們的事和尚說,你又有你的去罷,一年還不知是誰,原來林黛玉回頭看時,只聽一個,念道,三姐姐,你這個不知,

王夫人道,這就是了,賈母道,你們就沒聽見響,一時,只聽賈環在外間屋子裡拿著東西弄神之中意是寶玉,寶玉接著周瑞家子,推給庄頭,怎麼到了家裡,你們一家子也不知往那裡去了,寶玉只得答應著,賈母道,倒有一件事情,他也不是什麼正經事,你來的好,再這麼大膽子又這麼個人同著秋,字,探春正值寶玉紅玉上來,可見寶玉在夢中之物都是天下始人共一個弄這些,就是怎麼樣,又不能遵旨意,又道,你怎麼知道,因這幾個人在這裡,你們也該保山,寶玉道,可是我的罪孽了,況且我們忙著看了一回,因向寶玉道,我這裡正值寶釵見他不要那些,我知道我心裡怎麼樣呢,鳳姐兒笑道,你只管說,寶玉的事來,這便好了,又不敢笑著進來,寶玉便把賈母看,不是別人,正是這話,我早知這樣軟筋酥,你打諒你也不必提醒酒鬥牌,不是我說,也不敢言語,只管拿去,林黛玉忙問,這話說的極是,我原不要撞屍場後合了他的,芳官便說道,告訴二奶奶,這可不是這個主意,我們不能作詩,我

生成的內容里全是逗號是因為原文的標點被我統一成了一個分割標記,因此程序不會區分不同的標點符號。

==========分割線==========

最後,關於源代碼的問題,考慮到涉及源文本的版權問題,再加上代碼寫的有一點亂,我就先不開源了。不過感興趣的話可以在這裡下載單詞表的原始文件,可以導入 Excel 進行排序之類的操作:

https://louyu2015.github.io/story_of_a_stone/output.csv


在linux下只有終端的時候,經常需要查單詞,於是用python擼了個終端查詞軟體,查詞的效果是這個樣子:

安裝直接用pip就行了,GitHub: wierton/dict

sudo pip install yd

具體來說,程序會在本地~/.yd下建一個dict.db資料庫用於存儲所有搜索到的結果,開始查詞時會先搜索本地資料庫,找不到會抓取 http://dict.youdao.com 的網頁源碼,然後分析出單詞釋義、例句、音標等,然後緩存到資料庫中。


抓取建立知乎大V之間的關係網路,大V之間的關係真的是錯綜複雜啊!實現思路是以一個大V為起點,不斷的往上抓取關注列表,用 Neo4j 結合 Mysql 存儲用戶信息和用戶之間的關係,Neo4j 存儲人物關係,Mysql 存儲用戶的基本信息,這樣使 Neo4j 內容不會太多,導致後期存儲速度很慢。

數據粗略看一下就是這個樣子的,橙色表示的是知乎用戶,藍色箭頭線表示是用戶之間的關注和被關注的關係,限制100個點如下圖:

00. 誰是知乎上影響力最大的人?我們可以以粉絲的粉絲為評判標準,計算出關注某個人的所有大V的粉絲總和,和大V的數量,找出知乎上第二層粉絲數最多的人,第二層大V數量最多的人。

粉絲超過10000的大V關注最多的人前16位如下:其中黃繼新被 1288 位粉絲超過 10000 的大V關注,而粉絲超過 10000 的大V 共計有3089 位,佔了 42%,

而從關注的人的粉絲量來看,黃繼新的第二層粉絲數達到了 81221559 人,緊接著是張佳瑋的 71453074 人,查了一下我的只有 15125336 哭。

01. 我可以查一查有多少粉絲超過1W的 大V 關注了我,一共201個粉絲超過 1W 的大V關注了我,這 201 個大V 之間有 5169 條關係,也就是說每個大V 差不多會有 26 個關係,大V 之間的關係還是挺複雜噠!

然而更加精確一點,關注我的有多少粉絲過 10W 的呢?我來瞧一瞧:一共23個,一共24個人創造了249條關係,平均一個人有10 條人物關係,我的圈子好小啊!

02. 十萬粉以上的大V關係更加複雜,十萬粉絲以上的用戶目前有 298 名,卻貢獻了17548條人物關係,也就是說十萬粉絲以上的用戶平均每個人能認識到 58 個人左右,我落後了。

03.找到我想認識的人,我想認識知乎女神 @王諾諾 顯然她沒關注我,那麼我就找找有沒有王諾諾關注的人關注了我,說不定可以介紹我認識呢?只需要以女神為起點,尋找出兩層關係的並且最終指向我的關係網路。麻煩 @宋世泊 @雲天外 @鄒昕 @任易 趕緊給我介紹介紹!

很多人問我如何學習Python爬蟲,為此我整理編寫了一本Python爬蟲相關的電子書,主要包括Python入門、Python爬蟲入門到進階、Python爬蟲面試總結等等。可以在微信公眾號【一個程序員的日常】後台回復關鍵詞【1】獲取這本電子書。


寫過一個把圖片轉換成字元畫的小程序,效果如下

以下是代碼:

import Image

color = "MNHQ$OC?7&>!:-;." #zifu

def to_html(func):
html_head = """
&
&
&