0

サーバー サイトで ASP.NET を使用する Web サイトをクロールするためのアプリケーションを Python で作成しました。

それが私がやっていることです(ブラウザからHTTPヘッダーと本文をコピーしただけです。これを行う方法が他にないためです):

(そして、うまくいきました!少し前に..しかし、今では「接続タイムアウト」で中止されます。)

def SBPageLoader(keyWord):
    headers = {'Host': 'www.sberbank-ast.ru' ,
    'Connection': 'keep-alive' ,
    'Content-Length': '46203',
    'Cache-Control': 'max-age=0' ,
    'Origin': 'http://www.sberbank-ast.ru' ,
    'User-Agent': 'Mozilla/5.0 (Linux i686)' ,
    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' ,
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' ,
    'Referer': 'http://www.sberbank-ast.ru/purchaseList.aspx' ,
    'Accept-Encoding': 'gzip,deflate,sdch' ,
    'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' ,
    'Accept-Charset': 'utf-8' ,
    'Cookie': 'ASP.NET_SessionId=d4ki4j55hsq3km45b4qbrgjs; __utma=99173852.1461595200.1340564818.1341685237.1341758931.11; __utmb=99173852.4.9.1341758978151; __utmc=99173852; __utmz=99173852.1340564818.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)'
    }
#....( here is lots of data with undefined meaning - what is it? )......
    data = '_EVENTTARGET=&__EVENTARGUMENT=........&__VIEWSTATE=%2FwEPDwUJMzUwNDEzMjgxD2QWAmYPZBYCZg9kFgICAw9kFgQCAQ9kFgICAg8PFgIeB1Zpc2libGVoZGQCBQ9kFgICAQ9kFgYCAQ9kFgICAQ9kFgwCFQ8PZBYGHgdjb250ZW50BRRsZWFmOnB1YmxpY2RhdGVzdGFydB4JbWF4bGVuZ3RoBQIxMB4FY2xhc3MFCCBkYXRlUlVTZAIXDw9kFgYfAQUSbGVhZjpwdWJsaWNkYXRlpurchID400=887031'
    data = data.replace("Toyota", keyWord) # haha - cattlecode

    log("Strat loading http://www.sberbank-ast.ru/purchaseList.aspx ...")
    req = urllib2.Request('http://www.sberbank-ast.ru/purchaseList.aspx', data, headers)
    response = urllib2.urlopen(req)
    page = response.read()
    log(".. Loading is finished")

さて、古いボディとヘッダーを新しいものに置き換えても、同じことが起こります。

何が問題なのかについてのアイデアは大歓迎です。

4

1 に答える 1

1

Webサイトのセッションが期限切れになっている可能性があります。Cookieを見ると、セッション識別子が渡されていることがわかります。

'Cookie':' ASP.NET_SessionId = d4ki4j55hsq3km45b4qbrgjs ; __utma = 99173852.1461595200.1340564818.1341685237.1341758931.11; __utmb = 99173852.4.9.1341758978151; __utmc = 99173852; __utmz = 99173852.1340564818.1.1.utmcsr =(direct)| utmccn =(direct)| utmcmd =(none) '

(ちなみに、残りのCookieは無視できます。実際には、JavaScriptでクライアント側でのみ使用されるGoogle AnalyticsのCookieです。)

ほとんどのサーバーには、一定期間使用されない場合に期限切れになるセッションがあります。セッションがサーバーのメモリに保存されている場合、サーバーを再起動するとセッションは失われます。

ブラウザでサイトに戻って新しいセッション識別子を取得するか、その部分をクローラーに組み込む必要がある場合があります。

クローラーに組み込む場合は、サーバーから受け取ったCookieの保存を確認する必要があります。

于 2012-10-23T18:56:57.433 に答える