Почему я не могу загрузить эту веб-страницу на python? - PullRequest
1 голос
/ 08 ноября 2011

Пожалуйста, попробуйте сами :)!

curl http://www.windowsphone.com/en-US/apps?list=free

результат:

    <html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;checkda=1&amp;ct=1320735308&amp;rver=6.1.6195.0&amp;wp=MBI&amp;wreply=http:%2F%2Fwww.windowsphone.com%2Fen-US%2Fapps%3Flist%3Dfree&amp;lc=1033&amp;id=268289">here</a>.</h2>
</body></html>

или

def download(source_url):
    try:
        socket.setdefaulttimeout(10)        
        agents = ['Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)','Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)','Microsoft Internet Explorer/4.0b1 (Windows 95)','Opera/8.00 (Windows NT 5.1; U; en)']
        ree = urllib2.Request(source_url)
        ree.add_header('User-Agent',random.choice(agents))
        resp = urllib2.urlopen(ree)
        htmlSource = resp.read()
        return htmlSource
    except Exception, e:
        print e
        return ""

download('http://www.windowsphone.com/en-US/apps?list=free')

результатis:

<html><head><meta http-equiv="REFRESH" content="0; URL=http://www.windowsphone.com/en-US/apps?list=free"><script type="text/javascript">function OnBack(){}</script></head></html>

Я хочу загрузить фактический источник веб-страницы.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Причина сбоя в том, что http://www.windowsphone.com пытается установить cookie, который проверяется на https://login.live.com, который создает другой cookie и перенаправляет обратно на windowsphone.com в случае успеха.

Вы должны посмотреть на http://docs.python.org/library/cookielib.html

Если вы хотите использовать curl, разрешите ему создать cookie-файл примерно так:

curl -so /dev/null 'http://www.windowsphone.com/en-US/apps?list=free' -c 'myCookieJar'

Запустите more myCookieJar в вашей оболочке, и вы увидите что-то вроде этого:

# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

.www.windowsphone.com   TRUE    /       FALSE   0       WPMSLSS SLSS=1
login.live.com  FALSE   /       FALSE   0       MSPRequ lt=1320738008&co=1&id=268289

Выполнить (обратите внимание на параметр -b перед 'myCookieJar'):

curl -so 'windowsphone.html' 'http://www.windowsphone.com/en-US/apps?list=free' -b 'myCookieJar'

и вы получите содержимое страницы в файле windowsphone.html, как вы видите его в браузере.

2 голосов
/ 08 ноября 2011

У Flesk действительно есть ответ на этот вопрос (+1).

Еще один простой способ отладки HTTP-соединений - Netcat , который в основном является мощной утилитой telnet.

Допустим, вы хотите отладить то, что происходит в вашем HTTP-запросе:

$ nc www.windowsphone.com 80
GET /en-US/apps?list=free HTTP/1.0
Host: www.windowsphone.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

Это отправит заголовок запроса на сервер (вам нужно нажать клавишу ввода дважды для отправки).

После этого сервер ответит:

HTTP/1.1 302 Found
Location: https://login.live.com/login.srf?wa=wsignin1.0&rpsnv=11&checkda=1&ct=1320745265&rver=6.1.6195.0&wp=MBI&wreply=http:%2F%2Fwww.windowsphone.com%2Fen-US%2Fapps%3Flist%3Dfree&lc=1033&id=268289
Server: Microsoft-IIS/7.5
Set-Cookie: WPMSLSS=SLSS=1; domain=www.windowsphone.com; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Server: SN2CONXWWBA06
Date: Tue, 08 Nov 2011 09:41:05 GMT
Connection: close
Content-Length: 337

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="https://login.live.com/login.srf?wa=wsignin1.0&amp;rpsnv=11&amp;checkda=1&amp;ct=1320745265&amp;rver=6.1.6195.0&amp;wp=MBI&amp;wreply=http:%2F%2Fwww.windowsphone.com%2Fen-US%2Fapps%3Flist%3Dfree&amp;lc=1033&amp;id=268289">here</a>.</h2>
</body></html>

Таким образом, сервер возвращает 302, который является кодом состояния HTTP для перенаправления, и, таким образом, запрашивает "Браузер », чтобы открыть URL, переданный в Location-header.

Netcat - отличный инструмент для отладки и отслеживания всех видов сетевого взаимодействия, который очень мне помог, когда я захотел немного углубиться в протокол HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...