pythongettext
Ⅰ python2級字頻 課本原代碼,但是報錯,求大神解
字頻 words=aliceTxt.split()其實並沒有將單個字給列表化,如果是統計每個字的字頻,建議用words=list(aliceTxt),這樣就可以統計每個字的字頻。
Ⅱ python怎麼爬取某個人的微信朋友圈的信息
主要思路
從UI獲取文本信息是最為簡單的方法,於是應該優先逆向UI代碼部分。
逆向微信apk
首先解包微信apk,用dex2jar反編譯classes.dex,然後用JD-GUI查看jar源碼。當然,能看到的源碼都是經過高度混淆的。但是,繼承自安卓重要組件(如Activity、Service等)的類名無法被混淆,於是還是能從中看到點東西。
首先定位到微信APP package。我們知道這個是 com.tencent.mm。
在 com.tencent.mm
中,我們找到一個 ui
包,有點意思。
展開 com.tencent.mm.ui
,發現多個未被混淆的類,其中發現 MMBaseActivity直接繼承自 Activity
, MMFragmentActivity
繼承自 ActionBarActivity
, MMActivity
繼承自 MMFragmentActivity
,並且 MMActivity
是微信中大多數Activity的父類:
public class MMFragmentActivity
extends ActionBarActivity
implements SwipeBackLayout.a, b.a {
...
}
public abstract class MMActivity
extends MMFragmentActivity {
...
}
public class MMBaseActivity
extends Activity {
...
}
現在需要找出朋友圈的Activity,為此要用Xposed hook MMActivity。
創建一個Xposed模塊
參考 [TUTORIAL]Xposed mole devlopment,創建一個Xposed項目。
簡單Xposed模塊的基本思想是:hook某個APP中的某個方法,從而達到讀寫數據的目的。
小編嘗試hook com.tencent.mm.ui.MMActivity.setContentView這個方法,並列印出這個Activity下的全部TextView內容。那麼首先需要遍歷這個Activity下的所有TextView,遍歷ViewGroup的方法參考了SO的以下代碼:
private void getAllTextViews(final View v) {if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {View child = vg.getChildAt(i);
getAllTextViews(child);
}
} else if (v instanceof TextView ) {
dealWithTextView((TextView)v); //dealWithTextView(TextView tv)方法:列印TextView中的顯示文本}
}
Hook MMActivity.setContentView
的關鍵代碼如下:
findAndHookMethod("com.tencent.mm.ui.MMActivity", lpparam.classLoader, "setContentView", View.class, new XC_MethodHook() {...
});
在findAndHookMethod方法中,第一個參數為完整類名,第三個參數為需要hook的方法名,其後若干個參數分別對應該方法的各形參類型。在這里, Activity.setContentView(View view)方法只有一個類型為 View
的形參,因此傳入一個 View.class
。
現在,期望的結果是運行時可以從Log中讀取到每個Activity中的所有的TextView的顯示內容。
但是,因為View中的數據並不一定在 setContentView()時就載入完畢,因此小編的實驗結果是,log中啥都沒有。
意外的收獲
當切換到朋友圈頁面時,Xposed模塊報了一個異常,異常源從 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI這個類捕捉到。從類名上看,這個很有可能是朋友圈首頁的UI類。展開這個類,發現更多有趣的東西:
這個類下有個子類 a
(被混淆過的類名),該子類下有個名為 gyO的 ListView
類的實例。我們知道, ListView
是顯示列表類的UI組件,有可能就是用來展示朋友圈的列表。
順藤摸瓜
那麼,我們先要獲得一個 SnsTimeLineUI.a.gyO的實例。但是在這之前,要先獲得一個 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a的實例。繼續搜索,發現 com.tencent.mm.plugin.sns.ui.SnsTimeLineUI有一個名為 gLZ
的 SnsTimeLineUI.a
實例,那麼我們先取得這個實例。
經過測試, com.tencent.mm.plugin.sns.ui.SnsTimeLineUI.a(boolean, boolean, String, boolean)這個方法在每次初始化微信界面的時候都會被調用。因此我們將hook這個方法,並從中取得 gLZ。
findAndHookMethod("com.tencent.mm.plugin.sns.ui.SnsTimeLineUI", lpparam.classLoader, "a", boolean.class, boolean.class, String.class, boolean.class, new XC_MethodHook() {@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("Hooked. ");
Object currentObject = param.thisObject;
for (Field field : currentObject.getClass().getDeclaredFields()) { //遍歷類成員field.setAccessible(true);
Object value = field.get(currentObject);
if (field.getName().equals("gLZ")) {
XposedBridge.log("Child A found.");
childA = value;
//這里獲得了gLZ
...
}
}
}
});
現在取得了 SnsTimeLineUI.a
的一個實例 gLZ
,需要取得這個類下的 ListView
類型的 gyO
屬性。
private void dealWithA() throws Throwable{if (childA == null) {
return;
}
for (Field field : childA.getClass().getDeclaredFields()) { //遍歷屬性field.setAccessible(true);
Object value = field.get(childA);
if (field.getName().equals("gyO")) { //取得了gyOViewGroup vg = (ListView)value;
for (int i = 0; i < vg.getChildCount(); i++) { //遍歷這個ListView的每一個子View...
View child = vg.getChildAt(i);
getAllTextViews(child); //這里調用上文的getAllTextViews()方法,每一個子View里的所有TextView的文本...
}
}
}
}
現在已經可以將朋友圈頁面中的全部文字信息列印出來了。我們需要根據TextView的子類名判斷這些文字是朋友圈內容、好友昵稱、點贊或評論等。
private void dealWithTextView(TextView v) {String className = v.getClass().getName();String text = ((TextView)v).getText().toString().trim().replaceAll("\n", " ");if (!v.isShown())
return;
if (text.equals(""))
return;
if (className.equals("com.tencent.mm.plugin.sns.ui.AsyncTextView")) {//好友昵稱
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.SnsTextView")) {//朋友圈文字內容
...
}
else if (className.equals("com.tencent.mm.plugin.sns.ui.MaskTextView")) {if (!text.contains(":")) {
//點贊
...
} else {
//評論
...
}
}
}
自此,我們已經從微信APP里取得了朋友圈數據。當然,這部分抓取代碼需要定時執行。因為從 ListView中抓到的數據只有當前顯示在屏幕上的可見部分,為此需要每隔很短一段時間再次執行,讓用戶在下滑載入的過程中抓取更多數據。
剩下的就是數據分類處理和格式化輸出到文件,受本文篇幅所限不再贅述,詳細實現可參考作者GitHub上的源碼。
Ⅲ python gettext怎麼使用
編輯源代碼, 保存為gettextdemo.py
[python] view plain
import gettext
catalogs = gettext.find("example", localedir="locale", all=True)
print 'catalogs:',catalogs
t = gettext.translation('example', "locale", fallback=True)
_=t.ugettext
print(_("this message"))
Ⅳ python模塊i18n怎麼導入
Python通過gettext模塊支持國際化(i18n),可以實現程序的多語言界面的支持,下面是我的多語言支持實現:
1. 在python安裝目錄下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目錄中找到pygettext.py運行之,生成翻譯文件模版messages.pot,內容大概是這個樣子:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-24 15:05+China Standard Time\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: ENCODING\n"
"Generated-By: pygettext.py 1.5\n"
改之,charset=gb2312 Content-Transfer-Encoding: utf8如下:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-18 09:55+China Standard Time\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=gb2312\n"
"Content-Transfer-Encoding: utf8\n"
"Generated-By: pygettext.py 1.5\n"
那個msgid」 」 和msgstr」 「不要動
好,翻譯文件已經建立了,保存之,文件名改為lang.po.
2. 建立翻譯文件路徑,在主文件目錄下建立中文翻譯路徑 ./locale/cn/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\cn\LC_MESSAGES,其中src目錄是源文件主目錄),英文翻譯路徑 ./locale/en/LC_MESSAGES/(windows下例D:\ python-prj\src\locale\en\LC_MESSAGES,其中src目錄是源文件主目錄)
3. 在主文件中引入gettext模塊:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import gettext
gettext.install('lang', './locale', unicode=False)
gettext.translation('lang', './locale', languages=['cn']).install(True)
第四行中lang是翻譯文件主名, ./locale是存放翻譯文件的路徑,第三個參數是是否使用unicode,第五行languages參數指定要使用的語言存放的子目錄,這里cn表示使用./locale/cn/LC_MESSAGES/路徑下的翻譯文件.
注意: # -*- coding: utf-8 -*- 一定要寫在前兩行,寫第三行都不會生效
4. 處理要翻譯的字元串,例:
print 「Hello world!」
print 「Python is a good Language.」
改之:
print _(「Hello world!」)
print _(「Python is a good Language.」)
5. 編寫並生成翻譯文件,打開步驟1中編輯過的lang.po文件添加翻譯文字,形成如下內容:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2007-01-18 09:55+China Standard Time\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=gb2312\n"
"Content-Transfer-Encoding: utf8\n"
"Generated-By: pygettext.py 1.5\n"
msgid " Hello world!"
msgstr "世界你好!"
msgid " Python is a good Language."
msgstr "Python 是門好語言."
保存之,運行./Tools/i18n/目錄下的msgfmt.py,Linux下命令為: python msgfmt.py lang.po(widows下的話,將lang.po文件拷貝到./Tools/i18n/目錄下,運行命令行窗口,到改目錄下鍵入:msgfmt.py lang.po),生成lang.mo,將該文件拷貝至./locale/cn/LC_MESSAGES/目錄下,將步驟1生成的lang.po文件直接生成lang.mo文件拷貝到./locale/en/LC_MESSAGES/目錄下,好了一切都准備好了,命令行下運行你的主文件,看看兩個print命令是不是輸出了世界你好! Python 是門好語言.,如果將主文件第五行languages參數置為en,則輸出是Hello world! Python is a good Language.,因為en目錄下lang.mo文件未做任何的翻譯,默認字元串不被替換.
上述實現的方法用在界面編程上可以實現中英文界面的切換,需要作個配置文件選擇中/英文;或者在主文件開始時先獲取操作系統本地語言然後根據獲取結果再設置中/英文,這樣就可以實現軟體語言自適應;如果想實現軟體語言在線切換,對於python來說就比較困難了,需要在軟體中加入界面刷新機制,不推薦,可以在切換中/英文設置後軟體下一次啟動生效(軟體如Ulipad).
Note:
.調用python安裝目錄的 Tools/i18n/pygettext.py抽取所需翻譯的模板
>>> pygettext.py path/to/yourfile.py
將生成一個名為messages.pot的文件
2.生成模板文件後,修改這個模板文件,其中的msgid為鍵值,對應你程序里寫的文本,如:_("New File"),而msgstr為翻譯後的值。還有就是注意修改文件頭部分Content-Type的charset為合適的編碼,比如utf8
3.編寫好模板後,把擴展名修改為.po,運行Tools/i18n/msgfmt.py,生成二進制的資源文件
>>> msgfmt.py messages.po
將生成一個名為messages.mo的文件
4.把這個mo文件放在正確的位置.
比如你在程序中是這樣寫的:
gettext.install('i18ntest', './locale', unicode=True)
gettext.translation('i18ntest', './locale', languages=['cn']).install(True)
那麼你的程序目錄下需要存在./local/cn/LC_MESSAGES/i18ntest.mo
這樣程序啟動時就會讀取這個資源文件,替換對應的文本,實現國際化了。
注意:如果使用utf格式保存,po文件不能有BOM頭。cn目錄是所對應的語言,LC_MESSAGES目錄是gettext.py里要求的,mo文件必須和所定義的域同名,見
gettext.py的mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)
Ⅳ python爬蟲報錯,求詳細解釋
elems 變數返回的是一個列表,列表沒有text方法,但是列表裡的每一個元素是有的,write方法,接受一個字元串參數。
解決方法,獲取elems列表裡每一個元素的text,連接成一個字元串,寫入文件
在elems 那行後面加上
elems = [x.getText() for x in elems]
elems = ' '.join(elems)
write後直接加elems
Ⅵ python怎樣運行deluge
填入ip,如有root許可權,就用root和相應的密碼登陸
vps什麼的可以升級系統組件之類的
復制內容到剪貼板
代碼:
apt-get update
apt-get upgrade
安裝deluge之前需要先安裝python,因為有root許可權所以就不用sudo命令了,無root許可權的話在下面代碼前面要加上sudo
復制內容到剪貼板
代碼:
apt-get install python python-twisted python-twisted-web2 python-openssl python-simplejson python-setuptools gettext intltool python-xdg python-chardet python-geoip python-libtorrent python-notify python-pygame python-gtk2 python-gtk2-dev librsvg2-dev xdg-utils python-mako
接著我們就要下載deluge了,在這里我安裝的是deluge1.3.5
復制內容到剪貼板
代碼:
wget http://download.deluge-torrent.org/source/deluge-1.3.5.tar.bz2
bzip2 -d deluge-1.3.5.tar.bz2
tar -xvf deluge-1.3.5.tar
cd deluge-1.3.5
python setup.py install --install-layout=deb
至此deluge安裝完畢,輸入
復制內容到剪貼板
代碼:
cd
如果希望deluge開機運行則需要編輯/etc/rc.local,輸入
復制內容到剪貼板
代碼:
vi /etc/rc.local
然後在exit 0前面加上一行
復制內容到剪貼板
代碼:
deluged deluge-web
就可以了。
然後運行deluge及webUI
復制內容到剪貼板
代碼:
deluged
screen deluge-web
想看到deluge的情況,用本地瀏覽器訪問
復制內容到剪貼板
代碼:
http://遠程伺服器的ip:8112
第一次登陸需要輸入密碼,默認密碼為deluge,進入後修改就可以了。
下面就要對deluge進行設置了
1.路徑設置
2.網路
這個設置的關鍵是一定不要勾選dht
3.加密傳輸
這個如果想達到禁迅雷的效果的話應該是選用enable
4.帶寬管理
5.界面設置
6.其他
7.daemon
貌似是可以進行虛擬管理的東西,如有不對請指正
8.任務隊列
不要設太低,超過設置的任務數的任務會停止下載/上傳
9.代理伺服器設置
10.緩存設置
我的理解是想要設置的緩存換算為KB然後除以16
11.插件管理
貌似我安裝的deluge有點小問題,沒有顯示那些自帶的插件
在學校的話,最重要的插件是blocklist了,用於過濾ip,以免連接到校外ipv4產生不必要的流量。