0

IMDB のトップ 250 の映画の 250 の URL のシード ファイルがあります。

それらのそれぞれをクロールして、そこから情報を取得する必要があります。映画の URL を取得し、必要な情報を返す関数を作成しました。それはうまくいきます。私の問題は、250 個の URL すべてでこの関数を実行しようとしたときです。一定量 (一定ではありません!) の URL が正常にクロールされた後、プログラムは実行を停止します。python.exe プロセスは 0% の CPU を使用し、メモリ消費量は変わりません。いくつかのデバッグの後、問題は解析にあると考えました。動作が停止するだけで、理由がわかりません(findコマンドでスタックしました)。

urllib2 を使用して URL の HTML コンテンツを取得し、それを文字列として解析してから次の URL に進みます (これらの文字列ごとに 1 回だけ、すべてのチェックと抽出に線形時間をかけます)。

この種の動作の原因は何ですか?

編集:

問題のある関数のコードの1つを添付しています(もう1つ取得しましたが、同じ問題だと思います)

def getActors(html,actorsDictionary):

    counter = 0
    actorsLeft = 3
    actorFlag = 0
    imdbURL = "http://www.imdb.com"

    for line in html:        
        # we have 3 actors, stop
        if (actorsLeft == 0):
            break

        # current line contains actor information
        if (actorFlag == 1):
            endTag = str(line).find('/"    >')
            endTagA = str(line).find('</a>')

            if (actorsLeft == 3):
                actorList = str(line)[endTag+7:endTagA]
            else:
                actorList += "&#44; " + str(line)[endTag+7:endTagA]

            actorURL = imdbURL + str(line)[str(line).find('href=')+6:endTag]
            actorFlag = 0
            actorsLeft -= 1
            actorsDictionary[actorURL] = str(line)[endTag+7:endTagA]

        # check if next line contains actor information
        if (str(line).find('<td class="name">') > -1 ):
            actorFlag = 1

    # convert commas and clean \n
    actorList = actorList.replace(",","&#44; ")
    actorList = actorList.replace("\n","") 

    return actorList

私はこの方法で関数を呼び出しています:

for url in seedFile:
    moviePage = urllib.request.urlopen(url) 
    print(getTitleAndYear(moviePage),",",movieURL,",",getPlot(moviePage),getActors(moviePage,actorsDictionary))

これは getActors 関数がなくてもうまく機能します

ここで発生する例外はありません (今のところ、try と catch を削除しました)。いくつかの反復の後、for ループでスタックしています。

編集 2: getActors 関数のみを実行すると、うまく機能し、シード ファイル (250) 内のすべての URL が終了します。

4

0 に答える 0