zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【luogu】 P1433 吃奶酪
    【noip 2016】 组合数问题(problem)
    【清北学堂】 死亡(death)
    【noip 2004】 合并果子
    微信小程序:每个邮箱仅能申请一个小程序
    Babel-polyfill 的作用
    react.js中模拟事件总线,子组件调用父组件时,发挥作用
    多行文本溢出显示省略号(…) text-overflow: ellipsis ------------- webkit-line-clamp 多行文字溢出...
    es6-class
    ES6--promise
  • 原文地址:https://www.cnblogs.com/BxScope/p/10849221.html
Copyright © 2011-2022 走看看