0

我用 Python 编写了一个应用程序来爬取在服务器站点上使用 ASP.NET 的网站。

这就是我一直在做的(只是从浏览器复制 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

该网站的会话可能已过期。如果您查看 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=(直接)|utmccn=(直接)|utmcmd=(无)'

(顺便说一句,其余的 cookie 可以忽略,它们实际上是 Google Analytics cookie,仅在 JavaScript 中使用客户端。)

大多数服务器的会话如果在一段时间内不使用就会过期。如果会话存储在服务器的内存中,那么如果重新启动服务器,它们就会丢失。

您可能需要在浏览器中返回该站点并获取新的会话标识符,或者将该部分构建到您的爬虫中。

如果你想将它构建到你的爬虫中,那么你需要看看存储你从服务器收到的 cookie。

于 2012-10-23T18:56:57.433 回答