ヘッダ収集

はじめにURLを書いたテキストファイル「URL.txt」を用意する。

www.google.co.jp
www.yahoo.co.jp
www.microsoft.com/

URL.txtの内容を読み込んで、それぞれのサイトのヘッダを表示するスクリプトを作ってみる。
[headget.py]

#!/bin/env python
# -*- coding: shift_jis -*-
import httplib
import string

urlFile = open('URL.txt','r')
for x in urlFile.readlines():
    print x
    conne = httplib.HTTPConnection(string.rstrip(x))
    conne.request("GET", "/index.html")
    res = conne.getresponse()
    print res.msg
    conne.close()
urlFile.close()

string.rstrip(x)
ファイルから読み出したxの改行をrstripで消している。

headget.pyで取得したヘッダ情報をファイルに保存したいときは、コマンドプロンプトで以下のように入力

C:\Python23jp>headget.py > log.txt

printで表示される内容がlog.txtに書き込まれる

HTTPクライアント1

とりあえずネットワークプログラミングっぽい ことをやってみる。
参考:HTTP プロトコル
http://www.wakhok.ac.jp/~maruyama/W3serv/document/node92.html
socketを使った基本的なクライアントプログラム
googleに"Get"リクエストを送ってみる

#!/bin/env python
# -*- coding: shift_jis -*-
import socket

HOST = 'www.google.co.jp'    
PORT = 80              
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('GET /index.html HTTP/1.0\r\n')
s.send('\r\n')
data = s.recv(1024)
s.close()
print 'Received', data

ファイル内の#以下コメントの削除

ファイルを一行づつ読み込み、行内に#があったら#以下を削除して表示。
問題点

  • #のコメントにしか対応していない。
  • 「print "#コメントじゃないよ"」のような行でも#以下をコメントと認識してしまう。

[commentDe.py]

#!/bin/env python
# -*- coding: shift_jis -*-
import sys
import re

argv = sys.argv[1]            
for line in open(argv):
    if str(line).count("#"):
        splitline = re.split(r'#',line)
        line = splitline[0] + "\n"
    print line,
files.close()

myScript.pyのコメントを削除してnewScript.pyとして保存する場合。

c:\Python23jp>commentDe.py myScript.py > newScript.py

行番号表示

fileview.pyを行数を付けて表示するように変更してみる

[fileline.py]

#!/bin/env python
# -*- coding: shift_jis -*-
import sys

argv = sys.argv[1:]            
for i in argv:
    print "[" + i + "]"
    for n, line in enumerate(open(i)):
        print "%d: %s" % (n,line) ,
    print "-------------------------------------------------"

for n, line in enumerate(lines):
組み込み関数enumerateで変数linesをインデクス付けされた値の配列に変換している。
対話モードで試してみると解りやすい

>>> a = ["zz","yy"."zz"]
>>> for b in enumerate(a):
...  print b
...
(0, 'zz')
(1, 'yy')
(2, 'zz')
>>> for i,c in enumerate(a):
...  print i,
...  print c
...
0 zz
1 yy
2 zz
>>>^Z

ファイル内容表示

引数に指定されたファイルの内容を表示するスクリプトを作ってみる。
[fileview.py]

#!/bin/env python
# -*- coding: shift_jis -*-
import sys

argv = sys.argv[1:]            
for i in argv:
    print "[" + i + "]"
    files = open(i,'r')
    lines = files.readlines()
    for line in lines:
        print line,
    print "-------------------------------------------------"
    files.close()

argv = sys.argv[1:]
[1:]は配列の一つ目から最後までを指す(つまりsys.argv[0]以外)
こんな書き方もある。

#!/bin/env python
# -*- coding: shift_jis -*-
import sys

argv = sys.argv[1:]            
for i in argv:
    print "[" + i + "]"
    for line in open(i):
        print line,
    print "-------------------------------------------------"