【问题标题】:How come I can't download this webpage in python?为什么我不能用python下载这个网页?
【发布时间】:2011-12-24 05:13:54
【问题描述】:

请自己尝试一下:)!

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')

结果是:

<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>

我要下载网页的实际源代码。

【问题讨论】:

  • 页面似乎会根据您是否登录您的真实帐户进行重定向。您的脚本未登录真实帐户。
  • @Pengman 在浏览器上转到windowsphone.com/en-US/apps?list=free。我只想要这个 HTML 代码。我该怎么做?

标签: python http url curl download


【解决方案1】:

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 状态码,从而提示“浏览器”打开 Location-header 中传递的 URL。

Netcat 是调试和跟踪各种网络通信的好工具,当我想更深入地研究 HTTP 协议时,它给了我很多帮助。

【讨论】:

    【解决方案2】:

    它失败的原因是因为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'
    

    在你的 shell 中运行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
    

    运行(注意 'myCookieJar' 之前的 -b 选项):

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

    您将在浏览器中看到文件 windowsphone.html 中的页面内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多