0

小さなスクレイピングスクリプトがあります。私は2000の名前のファイルを持っており、これらの名前を使用してYouTubeでビデオIDを検索しています。量が多いため、すべてのIDを取得するのにかなり長い時間がかかるため、一度に取得することはできません。私が欲しいのは、最後のスクレイプをどこで終了したかを見つけて、その位置から開始することです。これを行うための最良の方法は何ですか?使用済みの名前をリストに追加して、リストに含まれているかどうかを確認することを考えていました。含まれていない場合は、スクレイピングを開始しますが、これを行うためのより良い方法があるでしょうか。(私はそう願っています)。

ファイルとスクレイプされたIDから名前を取得する部分。私が欲しいのは、スクレイピングをやめたとき、次にそれを開始したときに、最初からではなく、前回終了した時点から実行されることです。

index = 0
for name in itertools.islice(f, index, None):
    parameters = {'key': api_key, 'q': name}
    request_url = requests.get('https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=1&type=video&fields=items%2Fid', params = parameters)
    videoid = json.loads(request_url.text)
    if 'error' in videoid:
        pass
    else:
        index += 1
        id_file.write(videoid['items'][0]['id']['videoId'] + '\n')
        print videoid['items'][0]['id']['videoId']
4

2 に答える 2

2

最後にスクレイピングされたエントリのインデックス番号を思い出すことができます。1 つのエントリのスクレイピングが終了するたびにカウンターをインクリメントし、テキスト ファイル内のエントリの順序が変わらないと仮定して、その番号でもう一度取得しますか?

于 2013-01-29T00:28:52.380 に答える
0

ここでの最も簡単な答えは、おそらく mitim の答えです。各行の後に最後に処理されたインデックスで書き直したファイルを保持するだけです。例えば:

savepath = os.path.expanduser('~/.myprogram.lines') 
skiplines = 0
try:
    with open(savepath) as f:
        skiplines = int(f.read())
except:
    pass
with open('names.txt') as f:
    for linenumber, line in itertools.islice(enumerate(f), skiplines, None):
        do_stuff(line)
        with open(savepath, 'w') as f:
            f.write(str(linenumber))

ただし、ユースケースにより適した方法が他にもあります。

たとえば、各名前が処理された後に「names」ファイルを書き直して、最初の行を削除することができます。または、リストをanydbm(またはsqlite3) データベースに前処理して、完了後に名前をより簡単に削除 (またはマーク) できるようにすることをお勧めします。

または、異なるファイルに対して実行する可能性があり、それぞれの進行状況を維持する必要がある場合は、.linesファイルごとに個別のファイルを保存することができます (おそらく、最上位のホーム ディレクトリをフラッディングするのではなく、ディレクトリ~/.myprogramに保存します)。anydbm行へのパス名が完了しました。

于 2013-01-29T01:33:21.690 に答える