GitHack 源碼分析

PS:由於剛接觸Python因此就有不少沒接觸到的庫和函數,因此打算經過這種方式來學習這些庫和函數html

過程概述:

sys.argv[-1]獲取控制檯輸入的url賦值給base_urlpython

經過urlparse.urlparse(sys.argv[-1]).netloc.replace(':', '_')獲取給定url中的服務器地址賦值給domain瀏覽器

建立名爲domain的文件夾服務器

輸出:[+] Download and parse index file ...cookie

經過_request_data()函數獲取目標路徑下的index文件賦值給data網絡

建立index文件,在其中寫入上一步獲取到的dataapp

定義一個FIFO隊列dom

未完......socket

 


 

sys.argv

一個列表,其中包含了被傳遞給 Python 腳本的命令行參數。 argv[0] 爲腳本的名稱(是不是完整的路徑名取決於操做系統)。若是是經過 Python 解釋器的命令行參數 -c 來執行的, argv[0] 會被設置成字符串 '-c' 。若是沒有腳本名被傳遞給 Python 解釋器, argv[0] 爲空字符串。函數

urlparse.urlparse(urlstring[, scheme[, allow_fragments]])

將URL解析爲六個組件,返回一個6元組。 這對應於URL的通常結構:scheme://netloc/path;parameters?query#fragment。 每一個元組項都是一個字符串,多是空的。 組件不會以較小的部分分解(例如,網絡位置是單個字符串),而且不會展開%escapes。 如上所示的分隔符不是結果的一部分,除了路徑組件中的前導斜槓,若是存在則保留。

>>> from urlparse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
>>> o   # doctest: +NORMALIZE_WHITESPACE
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')
>>> o.scheme
'http'
>>> o.port
80
>>> o.geturl()
'http://www.cwi.nl:80/%7Eguido/Python.html'

 官方文檔:https://docs.python.org/zh-cn/2.7/library/urlparse.html#module-urlparse

class Queue.queue(maxsize=0)

FIFO隊列的構造函數。 maxsize是一個整數,用於設置能夠放入隊列的項目數的上限。 達到此大小後,插入將阻塞,直到消耗隊列項。 若是maxsize小於或等於零,則隊列大小爲無限大。

官方文檔:https://docs.python.org/zh-cn/2.7/library/queue.html#module-Queue

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

該類是URL請求的抽象。

url應該是包含有效URL的字符串。

data能夠是指定要發送到服務器的其餘數據的字符串,若是不須要這樣的數據,則爲None。 目前,HTTP請求是惟一使用數據的請求; 提供數據參數時,HTTP請求將是POST而不是GET。 數據應該是標準application / x-www-form-urlencoded格式的緩衝區。 urllib.urlencode()函數採用2元組的映射或序列,並以此格式返回一個字符串。

headers應該是一個字典,而且將被視爲調用add_header()時每一個鍵和值做爲參數。 這一般用於「欺騙」User-Agent標頭值,瀏覽器使用該標頭值來識別自身 - 某些HTTP服務器僅容許來自常見瀏覽器而非腳本的請求。 例如,Mozilla Firefox可能將本身標識爲「Mozilla / 5.0(X11; U; Linux i686)Gecko / 20071127 Firefox / 2.0.0.11」,而urllib2的默認用戶代理字符串爲「Python-urllib / 2.6」(在Python 2.6上) 。

最後兩個參數僅對正確處理第三方HTTP cookie感興趣:

origin_req_host應該是RFC 2965定義的origin事務的請求主機。它默認爲cookielib.request_host(self)。 這是用戶啓動的原始請求的主機名或IP地址。 例如,若是請求是針對HTML文檔中的圖像,則該請求應該是包含圖像的頁面請求的請求主機。

unverifiable應該代表請求是否沒法驗證,如RFC 2965所定義。它默認爲False。 沒法驗證的請求是用戶沒法選擇批准的URL。 例如,若是請求是針對HTML文檔中的圖像,而且用戶沒有選擇批准自動獲取圖像,則應該這樣。

import urllib2
url = 'http://www.baidu.com'
request = urllib2.Request(url)
print request

 運行結果:

C:\Python27\python.exe E:/python/GitHack-master/lib/test.py
<urllib2.Request instance at 0x00000000034F0088>

 返回一個Request實例

官方文檔:https://docs.python.org/zh-cn/2.7/library/urllib2.html#module-urllib2

urllib2.urlOpen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]]

打開URL ,url能夠是字符串或Request對象。

data能夠是指定要發送到服務器的其餘數據的字符串,若是不須要這樣的數據,則爲None。 目前,HTTP請求是惟一使用數據的請求; 提供數據參數時,HTTP請求將是POST而不是GET。 數據應該是標準application / x-www-form-urlencoded格式的緩衝區。 urllib.urlencode()函數採用2元組的映射或序列,並以此格式返回一個字符串。 urllib2模塊使用Connection發送HTTP / 1.1請求:包括close頭。

可選的timeout參數指定阻塞操做(如鏈接嘗試)的超時(以秒爲單位)(若是未指定,將使用全局默認超時設置)。 這實際上僅適用於HTTP,HTTPS和FTP鏈接。

若是指定了context,則它必須是描述各類SSL選項的ssl.SSLContext實例。 有關更多詳細信息,請參閱HTTPSConnection。

可選的cafile和capath參數爲HTTPS請求指定一組可信CA證書。 cafile應指向包含一組CA證書的單個文件,而capath應指向散列證書文件的目錄。 能夠在ssl.SSLContext.load_verify_locations()中找到更多信息。

cadefault參數被忽略。

此函數返回一個相似文件的對象,其中包含三個附加方法:

geturl() - 返回檢索到的資源的URL,一般用於肯定是否遵循重定向
    
info() - 以mimetools.Message實例的形式返回頁面的元信息,例如headers(請參閱HTTP標題的快速參考)
    
getcode() - 返回響應的HTTP狀態代碼。

import urllib2
url = 'http://www.baidu.com'
request = urllib2.Request(url)
print urllib2.urlopen(request)

 運行結果:

C:\Python27\python.exe E:/python/GitHack-master/lib/test.py
<addinfourl at 58013064L whose fp = <socket._fileobject object at 0x00000000034F67C8>>

 返回一個socket._fileobject 對象,也就是個文件對象

官方文檔:https://docs.python.org/zh-cn/2.7/library/urllib2.html#module-urllib2

class mmap.mmap(*fileno*, *length*[, *tagname*[, *access*[, *offset*]]])

(Windows版)映射文件句柄fileno指定的文件的length字節,並建立mmap對象。 若是length大於文件的當前大小,則文件將擴展爲包含length字節。 若是length爲0,則映射的最大長度是文件的當前大小,但若是文件爲空,則Windows引起異常(您沒法在Windows上建立空映射)。

tagname,若是指定而不是None,是一個字符串,給出映射的標記名稱。 Windows容許您針對同一文件具備許多不一樣的映射。 若是指定現有標記的名稱,則會打開該標記,不然將建立此名稱的新標記。 若是省略此參數或None,則建立沒有名稱的映射。 避免使用tag參數將有助於保持代碼在Unix和Windows之間可移植。

offset能夠指定爲非負整數偏移量。 mmap引用將相對於文件開頭的偏移量。 offset默認爲0. offset必須是ALLOCATIONGRANULARITY的倍數。

關於mmap對象

Memory-mapped file objects的行爲相似於字符串和文件對象。 然而,與普通的字符串對象不一樣,這些是可變的。 您能夠在大多數須要字符串的地方使用mmap對象; 例如,您可使用re模塊搜索內存映射文件。 因爲它們是可變的,您能夠經過執行obj [index] ='a'來更改單個字符,或者經過分配給切片來更改子字符串:obj [i1:i2] ='...'。 您還能夠從當前文件位置開始讀取和寫入數據,並經過seek()搜索文件到不一樣的位置。

官方文檔:https://docs.python.org/zh-cn/2.7/library/mmap.html#module-mmap

class collections.OrderedDict([items])

返回dict子類的實例,支持經常使用的dict方法。OrderedDict是一個dict,它記住鍵第一次插入的順序。若是一個新條目覆蓋了一個現有條目,原始插入位置將保持不變。刪除條目並從新插入將把它移動到末尾。

關於OrderedDict對象

有序字典就像普通字典同樣,可是它們記住條目插入的順序。當遍歷一個有序的字典時,條目將按照它們的鍵首先被添加的順序返回。

官方文檔:https://docs.python.org/zh-cn/2.7/library/collections.html#collections.OrderedDict

sorted(iterable[, cmp[, key[, reverse]]])

cmp指定一個由兩個參數(迭代元素)組成的自定義比較函數,根據第一個參數是小於、等於仍是大於第二個參數,該函數應該返回一個負數、零仍是正數:cmp=lambda x,y: cmp(x.lower(), y.lower())。默認值是None

key指定一個參數的函數,該函數用於從每一個列表元素中提取比較鍵:key = str.lower。 默認值爲None(直接比較元素)。

reverse 爲一個布爾值。 若是設爲 True,則每一個列表元素將按反向順序比較進行排序。

一般,鍵和反向轉換過程比指定等效的cmp函數要快得多。這是由於cmp對每一個列表元素調用屢次,而鍵和反向觸摸每一個元素僅一次。使用functools。cmp to key()將舊式cmp函數轉換爲鍵函數。

官方文檔:https://docs.python.org/zh-cn/2.7/library/functions.html#sorted

相關文章
相關標籤/搜索