拾荒者的垃圾場。
這兒有點荒蕪,而我繼續在生命中拾荒。

目前日期文章:201609 (3)

瀏覽方式: 標題列表 簡短摘要

承襲前篇的 submitter ,這篇就來講一下如何看送出去的結果。

我們要做的就是抓取網頁,然後分析出其中我們要的資料,然後簡潔的 show 出來。

廢話不多說,先引入函式庫。

import urllib2 # 一樣,抓網頁用的
from HTMLParser import HTMLParser #分析字串用的

接下來,來實作一下 Parser 繼承剛剛引入的 HTMLParser 類別。

HTMLPraser 中,我使用其中三個 method 就能完成這項任務,主要是實作這三個函式。(其他函式)

    def handle_starttag(self , tag , attrs)
    # 他會讀到開頭的tag , tag 是 html tag 類型 如 h1 , td , div ; attrs 是個 list 裡面有 屬性 map 值的關係

    def handle_data(self , data)
    # 他會讀到 開頭的 tag 和 結尾的 tag 之間的內容 ,
   # 但由於沒有 tag 變數可供辨別,所以我用上面的 starttag 立個 flag

    def handle_endtag(self , tag)
    # 就是讀到結尾的 tag
   

先繼承HTMLParser類別

class rsParser(HTMLParser):

建構子來個初始化

    def __init__(self):
        HTMLParser.__init__(self) #呼叫父類別物件建構子
        self.getData = False
        self.lastTag = ""
        self.probID = ""

實作 handle_starttag 函式

    def handle_starttag(self , tag , attrs):
        self.lastTag = tag # 為 handle_data 立 flag
        if tag == "td":
            for(attr , value) in attrs: # 算是從 map List 中 解開 map 拿出來用
                if attr == 'id':
                    print value , " "  , 
                if attr == 'width' and value == '12%': 
                    self.getData = True # 確認是我要的 table 
                if attr == 'width' and value == '40%': #立 flag 讓 handle_data 取
                    self.probID = True

實作 handle_data 函式

    def handle_data(self , data):
        if self.getData == True:
            if self.lastTag == 'td':
                if data.strip() != "": # strip 去除頭尾的空白
                    print data.strip() , " " ,
            if self.lastTag == 'span':
                if data.strip() != "":
                    print data.strip() , " " , 

實作 handle_endtag 函式

    def handle_endtag(self , tag):
        if tag == 'td' and self.getData == True: # 取下 flag
            print ""
            self.getData = False
        if tag == 'td' and self.probID == True:
            self.probID = False

最後來抓資料餵進 自定義 Parser 值得一提的是 python 並沒有像 C ,JAVA 特別去定義 main , 因此會將整份 code 當 main 跑過一遍 , 
如果 import 一個庫時,就有可能會執行到它只要當作 main 的部分 ,可是我們要的僅是 Class,就會發生非預期的執行。所以為了解決這個問題,需要調用 python 的一個變數
__name__ ,他會定義 .py 檔的狀態。

if __name__ == '__main__':
    req = urllib2.Request(status_url)
    response = urllib2.urlopen(req)
    page = response.read() #Get html file
    RSP = rsParser()
    RSP.feed(page)

my code : checker ,另外也寫了個查詢英文簡寫的小程式 abbreviate-helper,用於變數命名。

nobodyzxc 發表在 痞客邦 留言(0) 人氣()

最近上了OOP,要求在網頁式的online judge上做練習,在學校主機上寫好的 code 還要 ftp 下來複製貼到 online judge's page 感覺很麻煩

於是萌生了寫 http request 的想法。工具當然是之前用過 crawler 的 python 囉!

首先要處理的就是登入的問題,我知道瀏覽器跟主機之間的一些溝通靠的是 cookie 所以要先取得 cookie

先引入函式庫

import cookelib # 具備多種 cookie 的容器
import urllib # 將 json 格式的 post data 編成 html form 形式
import urllib2 # 裡面有個類似瀏覽器的物件,給予一種 cookie 種類,他就會使用那種 cookie 

要先宣告一個 cookie 的容器,我用的是火狐的 cookie 類型

cookie = cookielib.MozillaCookieJar('cookie.txt')

之後當前目錄就會新增一個 cookie.txt 檔 ,cookie 內容就會存在裡面

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))

這就是在建立類似瀏覽器的東東,給他一個會處理 cookie 的物件(processor)

瀏覽器有了,接下來 用 json 格式 在 post data 填一下帳號密碼

post_data = urllib.urlencode({"Account" : your_account , "UserPasswd" : your_pw })

your_account & your_pw 當然是字串囉!

至於那個 Account 和 UserPasswd 就看看一下網頁 <form>...</form>怎麼寫了

要看一下<input> tag 裡的 name 屬性,這個例子就是看以下兩個 tag 得出

<input name="Account" type="text">
<input name="UserPasswd" type="text">

注意,是 name 屬性,不是 id。

接下來送出請求

result = opener.open(login_url , post_data);

login_url 就是 登入畫面所在的 page 啦('www.a_url_of_login_.com' 當然是字串)!

cookie.save(ignore_discard=True , ignore_expires=True)

儲存 cookie 大功告成。之後 opener 就可以使用 cookie 了

接下來就簡單了,我要再送 online judge 就再用一次 post request 就好了

code = io.open(submit_file , 'r' , encoding = 'UTF-8')

submission_data = urllib.urlencode({
    "language" : language , 
    "code" : code.read() , 
    "problemid" : problemid , 
    })

try:
    result = opener.open(submit_url , submission_data);
except urllib2.HTTPError , e:
    print e.code
    print e.reason
else:
    rtn = os.system("rm cookie.txt 2> /dev/null")
    if rtn == 0:
        print "remove cookie.txt"
    else:
        print "remove cookie.txt failed"
    print "submit done!"

my code : submitter

nobodyzxc 發表在 痞客邦 留言(0) 人氣()

=動機=

這篇是用Antergos打出來的 ww

可能是最近看了Mr. Robot的關係 ,想把作業系統改爲Linux 。

原本就對windows有些意見 ,要試試 kali 時 ,虛擬機又 run 不起來 ,這讓我徹底怒了 。

(前天win10更新又搞死虛擬機)

本來想要把整個硬碟刷掉,但老爸建議買一塊硬碟來裝就好,於是乎就買了塊來裝了。

把原本的拆下,裝上新的,決定來裝 Arch Linux 來折疼一下,結果搞了半天,又換 Kali 也裝不起來 ,

最後找到了 Arch 的派生版 Antergos 也 QQ ...

回到宿舍,想說再來一次,用接 USB 的方式 直接裝,沒想到就成了!

因為重裝了三次 Arch (都是死在可恨的GUI) 對 pacman 已經有一定的熟練度了,所以用起 Antergos來格外順手~

(第一次Arch desktop manager 選 lightdm -> 死

     二                                         選    slim   -> 死

     三                                         選 gdm     -> 活   -> Xfce 死

                                                                              -> gnome 載半天,果斷關掉不搞了)

=正文=

Antergos 的安裝格外簡單,找載點下 iso 。

(載點藏在 tab 中,害我還找了一下 XDD),看你要載完整板還是簡化板,我是載完整板。

把 iso 檔副檔名改成 img (Win32DiskImager 才讀的到)

使用 Win32DiskImager 拷進 usb , 筆電 win10 關機加 shift 鍵(按住 shfit 滑鼠點關機)
esc 按住,再按開機鍵,進入 bios 選單。選裝著 antergos 的 usb 。

(其他 windows 版本看要怎麼進 bios 囉~,因為 win10 有快速開機,不按 shift 關機不行啊)

ST500L T012-1DG142 是我筆電上裝著 windows10 的硬碟,而 16 GB 的是裝有 antergos 的 USB。

我們的目標是裝到外接硬碟 ASMT 2105 上。選擇 USB 開機進入 antergos live CD。

一進到 antergos 你就會看到親切的安裝程式(Cnchi.py )了。不多說 ,Install it.

 

我選 gnome 因為有預設 ibus  :P (其實我比較想要 Xfce)

竟然有 Steam!但我沒玩,只是叫叫罷了。

由於是要為整塊硬碟裝新系統,就選上面的選項。

小心啊,要選到外接硬碟,不然本來的 windows 就要被洗掉了。(兩個都選要裝的硬碟)

等完之後它問你要不要重開機,選是,一樣抓好時機按 esc 進 bios 畫面。

這次直接就進入裝好的硬碟了,不是 USB 喔。預設桌布應該是下面圖片的藍色。

 

一開始中文都是亂碼,先開啟 terminal 下指令 

sudo pacman -S noto-fonts-cjk 

這樣瀏覽器才可以顯示中文。

開始安裝輸入法。

進入 setting 設定好語言後,安裝 ibus (gnome 預設安裝 ibus) ,奉上 wiki zh , en

懶得看 wiki 就繼續往下走吧,

terminal 下指令

sudo pacman -S ibus-chewing

ibus-setup

ibus-set 設定 -> Input Method -> Add -> Chinese -> 酷 chewiin ...

我中文輸入法裝了好幾種 rime(ㄓ) chewing (注音 , 新酷音)bopomofo(ㄅㄆㄇㄈ)

都是注音輸入 , 本人比較習慣新酷音

然後接下來很重要的一點!

回到桌面找系統應用 Settings -> Region & Language -> input source 那欄下面個 + ,

除了剛剛選好的 chinese ,再搜個 chin 就有剛裝好的那下 rime 啊 chewing啊

把他們選上吧!

 

這一步,我搞了好久...

然後就可以了 ˊ ˇ ˋ 我好喜歡它 terminal 提示的水滴聲喔。

nobodyzxc 發表在 痞客邦 留言(0) 人氣()

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼