好久以來都一直想學(xué)習windows中得iocp技術(shù),即異步通信,但是經(jīng)過長時間研究別人的c++版本,發(fā)現(xiàn)過于深奧了,有點吃力,不過幸好python中的twisted技術(shù)的存在方便了我。
iocp即異步通信技術(shù),是windows系統(tǒng)中現(xiàn)在效率最高的一種選擇,異步通信顧名思義即與同步通信相對,我們平時寫的類似socket.connect accept等都屬于此范疇,同樣python中得urlopen也是同步的(為什么提這個,是因為和后面的具體實現(xiàn)有關(guān)),總而言之,我們平時寫的絕大多數(shù)socket,http通信都是同步的。
同步的程序優(yōu)點是好想,好寫。缺點大家都應(yīng)該感受到過,比如在connect的時候,recive的時候,程序都會阻塞在那里,等上片刻才能繼續(xù)前進。
異步則是另一種處理思路,類似于xml解析的sax方法,換句話說,就是當面臨conncet,recive等任務(wù)的時候,程序先去執(zhí)行別的代碼,等到網(wǎng)絡(luò)通信有了結(jié)果,系統(tǒng)會通知你,然后再去回調(diào)剛才中斷的地方。
具體的代碼下面有,我就細說了,大概總結(jié)下下面代碼涉及到的技術(shù)
1.頁面解析,webshell密碼自動post,必然涉及到頁面解析問題,即如何去找到頁面中form表單中合適的input元素并提交,其中包括了hidden的有value,password的需要配合字典。具體實現(xiàn)靠的是SGMLParser
2.正常的頁面請求,我利用了urlopen(為了使用cookie,實際使用的是opener),片段如下
cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) req = urllib2.Request(url, urllib.urlencode(bodyfieleds)) resp = opener.open(req, timeout=60) strlist = resp.read()
代碼簡單,這就是python的魅力,bodyfieleds即為post的參數(shù)部分,是一個字典
3.異步的頁面請求,這里用了twisted的getpage片段如下:
self.PostDATA[self.passw] = passl #print temp zs = getPage(self.url, method='POST', postdata=urllib.urlencode(self.PostDATA), headers=self.headers) zs.addCallback(self.parse_page, self.url, passl).addErrback(self.fetch_error, self.url, passl)
可以看到如何利用getPage去傳遞Post參數(shù),以及header(cookie也是防盜header里面的)
以及自定義的Callback函數(shù),可以添加寫你需要的參數(shù)也傳過去,我這里使用了url和pass
4.協(xié)程并發(fā),代碼如下:
def InitTask(self): for passl in self.passlist[:]: d = self.addURL(passl) yield d def DoTask(self): deferreds = [] coop = task.Cooperator() work = self.InitTask() for i in xrange(self.ThreadNum): d = coop.coiterate(work) deferreds.append(d) dl = defer.DeferredList(deferreds)
新聞熱點
疑難解答
圖片精選