Pythonのurllib2を使用して、いくつかのスレッドで多数のHTTP GET要求を発行し、ファイルに応答を書き込むコードがスレッドごとに1つあります。
実行中、多くのホスト検索が失敗したように見えます(名前またはサービスの不明なエラーが発生しました。例のエラーログを参照)。urllib2で繰り返されるホストルックアップ
これはフレークなDNSサービスによるものですか?ホスト名が変更されていない場合、DNSキャッシングに頼るのは悪い習慣ですか?私。 1回の検索結果をurlopen
に渡す必要がありますか?
Exception in thread Thread-16:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/home/da/local/bin/ThreadedDownloader.py", line 61, in run
page = urllib2.urlopen(url) # get the page
File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.6/urllib2.py", line 391, in open
response = self._open(req, data)
File "/usr/lib/python2.6/urllib2.py", line 409, in _open
'_open', req)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/lib/python2.6/urllib2.py", line 1170, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.6/urllib2.py", line 1145, in do_open
raise URLError(err)
URLError: <urlopen error [Errno -2] Name or service not known>
UPDATE私の(非常に単純な)コード
class AsyncGet(threading.Thread):
def __init__(self,outDir,baseUrl,item,method,numPages,numRows,semaphore):
threading.Thread.__init__(self)
self.outDir = outDir
self.baseUrl = baseUrl
self.method = method
self.numPages = numPages
self.numRows = numRows
self.item = item
self.semaphore = semaphore
def run(self):
with self.semaphore: # 'with' is awesome.
with open(os.path.join(self.outDir,self.item+".xml"), 'a') as f:
for i in xrange(1,self.numPages+1):
url = self.baseUrl + \
"method=" + self.method + \
"&item=" + self.item + \
"&page=" + str(i) + \
"&rows=" + str(self.numRows) + \
"&prettyXML"
page = urllib2.urlopen(url)
f.write(page.read())
page.close() # Must remember to close!
セマフォは、実行中のスレッドの合計数を制約するBoundedSemaphoreあります。
誰かが尋ねる前に、はい、要求のいくつかは成功します。プログラムの構造は次のとおりです。各baseUrlの1つのスレッドで、各ファイルに対してopen baseUrl/fileを開き、スレッドのファイルにデータを追加します。 「ファイル」は実際には動的に生成され、そのようなファイルがなければ404を返すのではなく空になります。 –