3

Cookie を使用して Web サイトをスクレイピングしています。それらは複数のドロップダウン メニューを提供し、私は各オプションを反復処理し、リクエストごとにセッション Cookie を再取得しています。コードはしばらくは正常に実行されますが、ランダムに 503 エラーが発生します。

私のコードは PostgreSQL データベースにデータを挿入します。このエラーのランダム性を強調するために、1,200 エントリ (行) と 4,200 エントリ (行) を挿入した後に 503 を受け取ったことを共有したいと思います。この例外が発生するパターンは任意です。意味がわかりません。

それが役立つ場合は、ここに私のコードの一部があります:

# -*- coding: utf-8 -*-

import scrape_tools
import psycopg2
import psycopg2.extras
import urllib
import urllib2
import json
import cookielib
import time


tools = scrape_tools.tool_box()
db = tools.db_connect()
psycopg2.extras.register_hstore(db)
cursor = db.cursor(cursor_factory = psycopg2.extras.RealDictCursor)

cookiejar = cookielib.CookieJar()
opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookiejar),
)

url ='http://www.website.com/'
soup = tools.request(url)

type_select = soup('select',{'id':'type'})
for option_tag in type_select:
    select_option = option_tag('option')
    for option_contents in select_option:
        if 'Select' in option_contents.contents[0]:
            continue
        type = option_contents.contents[0]
        type_val = option_contents['value']
        print 'Type', type

        get_more_url = 'http://www.website.com/' + type_val
        request2 = urllib2.Request(get_more_url)
        fp2 = opener.open(request2)
        html2_object = fp2.read()
        json_result = json.loads(html2_object)

        for json_dict in json_result:
            for json_key in json_dict:
                if len(json_key) == 0:
                    continue
                more_data = json_dict[json_key]
                print '   ', more_data

               (---Out of courtesy, I'll stop here--)

scrape_tools(*カスタムモジュールであることに注意してください)

Cookie ストレージで何か不足していますか? 明らかな何かが欠けていますか?なぜこれが起こっているのか理解できないようです。同様の問題を抱えている人を何時間も探して「グーグル」、「スタックオーバーフロー」などしましたが、何も見つかりませんでした。

また、過去にセレンを使用してデータをスクレイピングし、最後の手段としてそれをポケットに入れましたが、このプロジェクトは巨大であり、Firefox がサーバーのメモリを 1 週間消費するのは避けたいと思います。

4

1 に答える 1

5

HTTP ステータス 503、「サービスを利用できません」は、何らかの理由でサーバーがリクエストを処理できなかったことを意味しますが、通常は一時的なエラーです。少し待ってから同じリクエストを再試行すると、おそらくうまくいくでしょう。

インターネットは一時的なエラーでいっぱいなので、大規模なスクレイピング ジョブでは、この種の一時的な障害を処理できる必要があります。接続が失敗するか、常に切断されます。ただし、通常は単純な再試行ポリシーで十分です。

ただし、ステータス 503 は、ページのリクエストが速すぎることを明確に意味している可能性があります。ページのフェッチ間に遅延がない場合は、礼儀のために遅延を追加する必要があります。

于 2012-11-02T21:57:07.550 に答える