pycurl无限循环和getopt问题

时间:2014-01-13 15:29:31

标签: python getopt pycurl

我不熟悉编码,并且在我去的时候尝试学习。

我正在尝试创建一个python脚本,它将从txt文件中的url列表中获取并打印所有HEADERS。

它好像到了那里,但是我陷入了与其中一个网址的无限循环,我不知道为什么而且由于某种原因“-h”或“ - help”不会返回{{1} }。任何帮助将不胜感激。

以下是我到目前为止:

usage()

这是最新的代码:

 #!/usr/bin/python

 import pycurl
 import cStringIO
 import sys, getopt

 buf = cStringIO.StringIO()
 c = pycurl.Curl()

 def usage():
     print "-h --help, -i --urlist, -o --proxy"
     sys.exit()

 def main(argv):
    iurlist = None
    proxy = None
    try:
       opts, args = getopt.getopt(argv,"hi:o:t",["help", "iurlist=","proxy="])
       if not opts:
         print "No options supplied"
         print "Type -h for help"
         sys.exit()
    except getopt.GetoptError as err:
       print str(err)
       usage()
       sys.exit(2)

    for opt, arg in opts:
       if opt == ("-h", "--help"):
          usage()
          sys.exit()
       elif opt in ("-i", "--iurlist"):
           iurlist = arg
       elif opt in ("-o", "--proxy"):
           proxy = arg
       else:
          assert False, "Unhandeled option"

 with open(iurlist) as f:
      iurlist = f.readlines()
      print iurlist

 try:
      for i in iurlist:
            c.setopt(c.URL, i)
            c.setopt(c.PROXY, proxy)
            c.setopt(c.HEADER, 1)
            c.setopt(c.FOLLOWLOCATION, 1)
            c.setopt(c.MAXREDIRS, 30)
            c.setopt(c.USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0')
            c.setopt(c.TIMEOUT, 8)
            c.setopt(c.CONNECTTIMEOUT, 5)
            c.setopt(c.NOBODY, 1)
            c.setopt(c.PROXY, proxy)
            c.setopt(c.WRITEFUNCTION, buf.write)
            c.setopt(c.SSL_VERIFYPEER, 0)
            c.perform()
            print buf.getvalue()
            buf.close

  except pycurl.error, error:
       errno, errstr = error
       print 'An error has occurred: ', errstr

 if __name__ == "__main__":
    main(sys.argv[1:])

2 个答案:

答案 0 :(得分:0)

您正在使用

  

如果opt ==(" -h"," - help"):

用于帮助选项,但

  

如果选择 (....)

用于所有其他选项。 opt可以是-h--help,但不能同时使用in,因此您需要使用opt检查{{1}}是否也是其中之一。

答案 1 :(得分:0)

如果您正在学习,pycurl可能不是最佳选择。他们认为您熟悉libcurl库。来自http://pycurl.sourceforge.net/

  

PycURL面向高级开发人员 - 如果您需要数十个并发,快速,可靠的连接或上面列出的任何复杂功能,那么PycURL就适合您。

     

PycURL的主要缺点是它是一个比libcurl更薄的层,没有任何好的Pythonic类层次结构。这意味着它有一些陡峭的学习曲线,除非您已经熟悉libcurl的C API。

这是他们进行多重抓取的方式:https://github.com/pycurl/pycurl/blob/master/examples/retriever-multi.py


要获取标题 a la python ,请安装requests库,然后执行以下操作:

for url in list_of_urls:
    r = requests.get(url)
    print r.headers

要处理命令行参数,请使用python附带的电池中的argparser