[Python] 知乎多線程爬蟲

知乎多線程爬取問題:css

clipboard.png

自打放了寒假,我就一直想把系統的學習一遍Python爬蟲的知識。由於之前只是零碎的學習,形成許多東西都只是只知其一;不知其二。 git

項目靈感來源是以爲單曲循環的歌至少讓一我的曾經在聆聽中感動過,歌曲的歌詞中或許有觸動他的旋律,也可能只是歌詞恰巧與他的人生經歷類似。不論怎樣,我以爲能讓一我的單曲循環的歌一定不差,因此就但願能得到這些歌曲名稱並在網易雲生成歌單。 github

然而,當我看到各位答主的答案後,我就發現有點麻煩了。
好比:sql

南山南數據庫

----------------我是不安分的分割線---------好多評論裏的小夥伴說不得不推薦 傲寒 也是馬頔歌曲裏我愛的一首 若是說 南山南是一見傾心 被開頭的「你在南方的豔陽天 大雪紛飛 我在北方的寒夜裏四季如春」驚豔到 一點也不爲過 而傲寒 更可能是日久生情「若是全世界對你惡語相加 我就對你說上一世情話」 這麼美的歌詞 仍是在我某天一大凌晨苦逼化妝中猛然注意到的
而且因爲這兩首歌 我下定了要學吉他的年頭 而且我已經單曲循環了兩週了 還沒厭 良心推薦服務器

做者:JoyHsu多線程

連接:https://www.zhihu.com/questio...ide

我發現有很多答案中歌名是和其它話混在一塊兒的,那這樣的狀況怎麼處理呢?

很天然的,我想起來了天然語言處理,奈何寒假還沒時間看NLTK庫,不過我卻是知道jieba這個中文分詞庫,而後就直接試了一下,分出來的結果是這樣的:

南山|n 南|n -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w -|w 我|r 是|v 不安|a 分|v 的|u 分割線|n -|w -|w -|w -|w -|w -|w -|w -|w -|w 好多|m 評論|v 裏|n 的|u 小|a 夥伴|n 說|v 不得|v 不|d 推薦|v 傲|a 寒|a 也|d 是|v 馬|n 頔|n 歌曲|n 裏|n 我|r 愛|v 的|u 一|m 首|q 若是|c 說|v 南山|n 南|n 是|v 一|m 見|v 鍾情|n 被|p 開頭|v 的|u 你|r 在|p 南方|n 的|u 豔陽天|n 大雪|n 紛飛|v 我|r 在|p 北方|n 的|u 寒|a 夜裏|n 四|m 季|n 如春|v 驚豔|v 到|v 一點|m 也|d 不|d 爲|p 過|v 而|c 傲|a 寒|a 更多|d 是|v 日|n 久|a 生情|v 若是|c 全世界|n 對|p 你|r 惡語|n 相|d 加|v 我|r 就|d 對|p 你|r 說|v 上|n 一世|n 情話|n 這麼|r 美的|n 歌詞|n 仍是|d 在|p 我|r 某|r 天|n 一|m 大|a 凌晨|n 苦|a 逼|v 化妝|v 中|n 猛然|d 注意|v 到|v 的|u 而且|c 因爲|c 這|r 兩首|n 歌|n 我|r 下定|v 了|u 要|v 學|v 吉他|n 的|u 年頭|n 而且|c 我|r 已經|d 單曲|n 循環|v 了|u 兩|m 周|n 了|u 還|d 沒|d 厭|v 良心|n 推薦|v

看到了吧,南山被分了出來,然而南山南卻沒有分出來,傲寒也沒有分出來,由於用的語料庫都是好久之前的詞語,不可能有歌名這種詞語,而後我一度停了好幾天都在思考怎麼解決。
仍是沒法解決,由於以我目前匱乏的專業知識只憑借瞎想是沒有做用的。

而後我繼續分析,發現有好多人都會使用書名號《》來引用歌名。
好比:

五月天《步步》

相似這樣的答案仍是挺多的,我就直接拿正則匹配書名號裏面的內容。

關於程序,知乎登陸部分是參考知乎上的一個回答(@xchaoinfo)。

我本身嘗試把爬蟲分紅了解析器(parser),數據流存儲器(store),以及規則器(rules),實際上寫的很low。不過也算有了那麼點意思。

而後就是加了多線程,關於多線程的使用,我實測對於爬蟲的效率絕對是有用的,由於爬蟲大部分時間都是等待服務器響應而後下載,因此多線程徹底能夠把等待的這部分時間來並行處理,節省時間。

關於存儲這一部分,有不少選擇,你徹底能夠簡單選擇存儲到文本文件,也能夠存儲到excel文件,最好是存儲到數據庫,使用起來會極大的方便。因此我一開始是學了Python的sqlite3模塊,爲了省事,由於sqlite3是自帶的。我在會給出一些我學習看到的好的教程。

最後我想提的是,對於BeautifulSoup vs. lxml的效率。之前也沒用過lxml,也沒以爲bs慢,直到我用了它之後,我估計之後不再想用bs了

  • 首先是bs不支持xpath語法選擇

  • 重點是bs的效率是真的跟lxml差了好多倍

我感受xpath能夠實現簡化,由於你經過它抽取一個特定的元素只須要一個字符創(此處也許有人說bs的select也能夠實現啊),可是事實上bs對css selector支持的並非特別好,並且拋開效率不談,xpath功能很豐富啊,還有不少函數以及操做符可使用,若是你認真學習它的話,文末我也會附上教程連接。

我寫的代碼實在是渣,寫代碼量太少了。
能夠優化的點,爬蟲結構的抽象,異常機制的使用,!!日誌的使用。

參考連接:

代碼連接:

爬取結果:
連接:excel文件 密碼:c7wt

原定計劃是後續處理每個歌名在網易雲裏面經過API插曲評論數目,以評論數目做爲關鍵字排序,而後建立一個歌單。
哇哇~~想一想仍是蠻有意思的@_@

最後,祝你們新的一年,學到更多的知識。

相關文章
相關標籤/搜索