0

for ループを使用して Web ページをクロールします。ただし、いくつかのページをクロールしているときに、ip request limit エラーが発生します。20ページごとにクロールしたときにpythonを数秒間スリープさせようとしましたが、エラーが発生します。Python が 60 秒スリープした後、再びクロールを開始できます。

問題は、例外が発生するたびに、情報のページが失われることです。python は try-except メソッドを使って例外ページを飛び越えているようです。

例外が発生したページから再度クロールを再開するのが最善の方法ではないかと考えています。

私の質問は、例外的なページからクロールを再開する方法です。

pageNum = 0

for page in range(1, 200):
    pageNum += 1
    if(pageNum % 20 ==0):  # every 20 pages sleep 180 secs
        print 'sleeep 180 secs'
        time.sleep(180)  # to oppress the ip request limit
    try:
        for object in api.repost_timeline(id=id, count=200, page=page): 
            mid = object.__getattribute__("id")
            # my code here to store data
    except:
        print "Ip request limit", page
        sleep.time(60)
4

2 に答える 2

4

ページの a を使用しstackます。popページ、失敗した場合は再度追加します。

from collections import deque

page_stack = deque()
for page in range(199, 0, -1):
    page_stack.append(page)

while len(page_stack):
    page = page_stack.pop()

    try:
        ## Do something
    except IPLimitException, e:
        page_stack.append(page)

コードが無限ループに陥る可能性があります。必要に応じて、実行できる試行のしきい値を維持できます。カウンターを保持し、そのしきい値が使い果たされた場合にページをスタックに追加しません。

于 2012-05-20T13:51:56.250 に答える
2

コードを可能な限り自分のものに近づけるには、次のようにするだけです。

pageNum = 0

for page in range(1, 200):
    pageNum += 1
    if(pageNum % 20 ==0):  # every 20 pages sleep 180 secs
        print 'sleeep 180 secs'
        time.sleep(180)  # to oppress the ip request limit
    succeeded = False
    while not succeeded:
        try:
            for object in api.repost_timeline(id=id, count=200, page=page): 
                mid = object.__getattribute__("id")
                # my code here to store data
            succeeded = True
        except:
            print "Ip request limit", page
            sleep.time(60)

もちろん、無限ループに陥る危険を冒す代わりに、ある種の制限を含めることもできます。ところで、pageNum を取り除くこともできます (page を使用するだけです)。

于 2012-05-20T13:56:30.070 に答える