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 += ", " + 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(",",", ")
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 が終了します。