GitHack 源码分析

PS:因为刚接触Python所以就有很多没接触到的库和函数,所以打算通过这种方式来学习这些库和函数

过程概述:

sys.argv[-1]获取控制台输入的url赋值给base_url

通过urlparse.urlparse(sys.argv[-1]).netloc.replace(':', '_')获取给定url中的服务器地址赋值给domain

创建名为domain的文件夹

输出:[+] Download and parse index file ...

通过_request_data()函数获取目标路径下的index文件赋值给data

创建index文件,在其中写入上一步获取到的data

定义一个FIFO队列

未完......


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:Python27python.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:Python27python.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

原文地址:https://www.cnblogs.com/BxScope/p/10849221.html