1

簡単なクローラーを作成しようとしています。ただし、サーバーからの応答を読み取ろうとすると、最初にのみ応答が返されます。次に、リーダーはバイトの読み取りを停止し、b'' を返します。タイムアウトを入れて、書き込み後にdrain()を使用しようとしました。結果を出していません。Wireshark は回答がサーバーから来ていることを示していますが、私のプログラムは回答を認識していません。

import asyncio

HOST = '93.184.216.34'
PORT = 80
CONCURRENT_CONNECTIONS = 3

request = 'GET / HTTP/1.1\r\n' \
          'Host: example.com\r\n' \
          'Content-Type: application/x-www-form-urlencoded\r\n' \
          '\r\n'.encode()


async def smart_read(reader):
    buffer = b''
    while True:
        response = await reader.read(1024)
        if not response:
            break
        buffer += response
    return buffer


async def work(host, port, request):
    reader, writer = await asyncio.open_connection(host, port)
    while True:
        writer.write(request)
        resp = await smart_read(reader)
        print(resp)


tasks = []
for _ in range(CONCURRENT_CONNECTIONS):
    tasks.append(asyncio.ensure_future(work(HOST, PORT, request)))

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
4

1 に答える 1

0

StreamReaderが EOF に達すると、常に が返されます。リーダーのフラグをb''クリアできますが、ハックです。_eofStreamReader をサブクラス化して多くのリクエストを処理することは、合理的な解決策のようです。

クイック 'n' ダーティ (実際には使用しないでください)

async def work(host, port, request):
    reader, writer = await asyncio.open_connection(host, port)
    while True:
        reader._eof = False  # force to read
        writer.write(request)
        resp = await smart_read(reader)
        print(resp)
于 2016-01-31T22:29:19.247 に答える