py爬取英文文档学习单词
最近開始看一些整本整本的英文典籍,雖然能看個大概,但是作為四級都沒過的我來說還是有些吃力,總還有一部分很關鍵的單詞影響我對句子的理解,因為看的是紙質的,所以查詢也很不方便,于是想來個突擊,我想把程序單詞收攏在一起學習一下,希望這樣的更有針對性一些,因為你想,arbitrary (任意的,武斷的)這樣的單詞不太可能會出現在技術文檔上,學了這樣的單詞對理解英文技術文檔沒有太大幫助。所以今天花了幾個小時研究了一下,發現是很可行的,實現也不算難。步驟主要是以下幾點,第一:先搞定翻譯接口。翻譯的來源分為接口型和爬蟲型,我看了看百度的那個翻譯頁面,不是很好爬,但是百度官方提供了翻譯的接口,只要申請成為百度的開發者即可,然后利用百度給的app key即可實現翻譯,而且接口也很豐富,但是我還是覺得略微麻煩。另外一個就是谷歌了,我仔細看了看谷歌翻譯頁面的接口,發現竟然出奇的簡單,只有一個set-cookie的接口,然后就是翻譯的接口,你肯定猜到了,我用的就是爬取谷歌的翻譯頁面。第二:爬取你想分析的英文文檔的單詞。翻譯嘛,總的有大批的單詞啊,那么我這邊也是通過爬蟲獲取的,給定一個頁面,比如https://docs.python.org/3/library/abc.html#module-abc這樣的技術文檔,我們需要把所有看上去像單詞的單詞都正則匹配出來,然后逐個調用翻譯接口翻譯出來。好了,思路的介紹就是這樣了,如果你已經產生了興趣,你可以不往下看,自己先擺弄一番,如果你覺得想先看看我的實現,那我也十分歡迎。OK,我們先上一張結果圖,。這個就是所謂的爬取和翻譯的結果了。那么我們緊接著貼一下代碼吧:
# -*- coding: utf-8 -*- import re, urllib.parse, urllib.request, http.cookiejar# 以下四行代碼是為了緩存cookie用的,谷歌翻譯接口給不給你翻譯,他只看請求源有沒有他認可的cookie,一般的urllib.request請求是不會緩存cookie的 cj = http.cookiejar.LWPCookieJar() cookie_support = urllib.request.HTTPCookieProcessor(cj) opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler) urllib.request.install_opener(opener)# 通過get請求來獲取數據,這里需要注意的是,headers是應該帶上的,雖然是get請求,但是某些網站的后臺是會檢測請求有沒有帶headers的,不帶headers被認為是爬蟲,他不理睬的,所以我們也要模擬一下 def getData(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}request = urllib.request.Request(url = url, headers = headers)response = urllib.request.urlopen(request)text = response.read().decode('utf-8')return text# 谷歌翻譯頁面只需要登陸一次 google_logined = False# 翻譯函數 def translate(word):if not google_logined:
# 剛才說的那個set-cookie的接口就是下面這個簡短的http://tr...../,他會設置一段cookiegetData('http://translate.google.cn/')global google_loginedgoogle_logined = Truetry:
# 常常的url就是翻譯接口,最后帶上需要翻譯的單詞data = getData("http://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&hl=zh-CN&dt=bd&dt=ex&dt=ld&dt=md&dt=qc&dt=rw&dt=rm&dt=ss&dt=t&dt=at&dt=sw&ie=UTF-8&oe=UTF-8&oc=2&otf=1&srcrom=1&ssel=0&tsel=0&q=" + word)
# 其實翻譯出來的東西蠻多的,可是我們只需要最前面的中文就好了,于是正則匹配一下拿出來即可reg = re.compile('^\[\[\[\"(.+?)\",\"(.+?)\"\]')tran = reg.findall(data)[0]
# 一開始我沒有用try except,發現有些單詞的翻譯json結構變了,估計是不好翻譯以后,谷歌給的json很短,正則匹配出錯了,所以try一下吧except:return ('error========================>>>'+word)return tran# 這個正則用途你也許猜到了,就是正則匹配一個頁面的所有的單詞,但是性能并不是很好,他會把<span>apple</span>中的span和apple都匹配出來,不過稍加處理也就可以解決,咱先讓性能一邊玩去 parse_word_reg = re.compile('([a-zA-Z]{3,})')# 解析頁面單詞的函數,參數為url,用上面的正則去匹配,返回來的是一個結果列表,另外我用set這個集合生成函數做了一下過濾,用過python的童鞋懂的。。。 def parse_words(url):content = getData(url)words = parse_word_reg.findall(content)words = list(set(words))return words# 好了,萬函具備,只欠測試了,我們傳一個技術文檔的url進去實施吧,發現他就逐個逐個開始翻譯了。 words = parse_words("https://docs.python.org/3/library/abc.html#module-abc") for word in words:print(translate(word))
?
轉載于:https://www.cnblogs.com/xuchaosheng/p/3835824.html
總結
以上是生活随笔為你收集整理的py爬取英文文档学习单词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【点击模型学习笔记】Predicting
- 下一篇: BT5之配置笔记