0
import http.client
import csv

def http_get(url, path, headers):
    try:
        conn = http.client.HTTPConnection(url)
        print ('Connecting to ' + url)
        conn.request(url, path, headers=headers)
        resp = conn.getresponse()
        if resp.status<=400:
            body = resp.read()
            print ('Reading Source...')
    except Exception as e:
        raise Exception('Connection Error: %s' % e)
        pass
    finally:
        conn.close()
        print ('Connection Closed')

    if resp.status >= 400:
        print (url)
        raise ValueError('Response Error: %s, %s, URL: %s' % (resp.status, resp.reason,url))
    return body


with open('domains.csv','r') as csvfile:
    urls = [row[0] for row in csv.reader(csvfile)]

L = ['Version 0.7','Version 1.2','Version 1.5','Version 2.0','Version 2.1','Version 2.3','Version 2.5','Version 2.6','Version 2.7','Version 2.8','Version 2.9','Version 2.9','Version 3.0','Version 3.1','Version 3.2','Version 3.3','Version 3.4','Version 3.5.1','Version 3.5.2']
PATH = '/'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
HEADERS = {'User-Agent': user_agent}

for url in urls:        
    HOST = url

    print ('Testing WordPress Installation on ' + url)
    http_get(HOST,PATH,HEADERS)

私はこれを1、2週間見ていて、同様のエラーを見つけましたが、csvファイルの一部のサイトでは機能し、他のサイトでは機能しない理由がわかりません. サーバーをチェックしたところ、デフォルトで ICMP パケットがドロップされていることがわかったので、それを変更したところ、以前は 100% 失われていたのに対し、traceroute と ping の両方が 100% 受信されるようになりました。そのホスト上のすべてのサイトに同じ問題があったため、関連していると考えました。ただし、私のスクリプトはまだ例外をスローしています:

mud@alex-BBVM:~/Desktop/scripts$ python3 httpTest.py
Testing WordPress Installation on XXXXX.ie
Connecting to exsite.ie
Reading Source...
Connection Closed
Testing WordPress Installation on AAAAAA.com
Connecting to AAAAA.com
Reading Source...
Connection Closed
Testing WordPress Installation on YYYYY.ie
Connecting to YYYYY.ie
Reading Source...
Connection Closed
Testing WordPress Installation on CCCCC.ie
Connecting to CCCCCC.ie
Reading Source...
Connection Closed
Testing WordPress Installation on DDDDDDD.ie
Connecting to DDDDDDD.ie
Connection Closed
Traceback (most recent call last):
  File "httpTest.py", line 9, in http_get
    resp = conn.getresponse()
  File "/usr/lib/python3.2/http/client.py", line 1049, in getresponse
    response.begin()
  File "/usr/lib/python3.2/http/client.py", line 346, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.2/http/client.py", line 328, in _read_status
    raise BadStatusLine(line)
http.client.BadStatusLine: <html>


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "httpTest.py", line 38, in <module>
    http_get(HOST,PATH,HEADERS)
  File "httpTest.py", line 14, in http_get
    raise Exception('Connection Error: %s' % e)
Exception: Connection Error: <html>

URL はクライアントのアドレスであるため、明らかにプレースホルダーに置き換えました。ここには掲載したくありません。

とにかく、洞察や助けをいただければ幸いです。

http.client のドキュメントを読みましたが、これは関連する例外ですが、そこから収集したものから解決策を抽出できないようです。

ありがとう!

4

1 に答える 1

0

HTTPResponseまず、 を呼び出す前に、常にオブジェクトからすべてを読み取ることをお勧めしますconn.close()。404 応答にもドキュメントが含まれています。

私が見ることができる限り、私はあなたのトレースバックにかなり混乱してhttp.client.BadStatusLineいますexcept Exception.

通常、except Exception同じ例外を再発生させない限り (そうではない場合)、根本的な問題を隠している可能性があるため、句はお勧めできません。いずれにせよ、コードが期待どおりに機能しない場合は、最初に実行する必要があります。

さらに、提供した出力は、提供したコードと一致していないようです。

具体的には、トレースバックによると:

Connection Closed
Traceback (most recent call last):
  File "httpTest.py", line 9, in http_get
    resp = conn.getresponse()

このコードには、print ('Connecting to ' + url)直前に次のものがあります。

print ('Connecting to ' + url)
conn.request(url, path, headers=headers)
resp = conn.getresponse()

しかし、出力のトレースバックの前の行はConnection Closed.


アップデート

の紛らわしい実行順序を無視しtry / finallyます。

http.client.BadStatusLine初期応答が のようなものでない場合は発生しHTTP/1.1 200 OKます。この特定のケースでは、<html>代わりにそうです。

サーバーが HTTP ヘッダーなしでドキュメントを返しているかのいずれかです。または、コードの予期しない動作です。

すでに言ったことを繰り返します: 常にHTTPResponseオブジェクトからすべてを読み取ります。

パケット キャプチャは、このサーバーで何が行われているかを確認します。

于 2013-08-16T13:22:47.177 に答える