我不熟悉编码,并且在我去的时候尝试学习。
我正在尝试创建一个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:])
答案 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
。