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

相关文章
相关标签/搜索