【问题标题】:urllib2.urlopen failing while urllib.urlopen working on same URLurllib2.urlopen 失败,而 urllib.urlopen 在相同的 URL 上工作
【发布时间】:2013-11-28 19:53:27
【问题描述】:

我正在尝试使用 urllib 和 urllib2 从特定网站抓取一些数据。

现在 urllib 主要用于读取和处理数据,而带有 urllib2 的代码部分主要用于读取和存储数据。

外部站点发生了一些变化,而 urllib 代码部分继续工作,而 urllib2 部分只是倒下了。

所以我做了一些检查,发现 urllib2.urlopen(URL) 总是返回一个空白字符串,而 urllib.urlopen(URL) 总是工作正常。

我深入挖掘并在 urllib 和 urllib 模块上启用调试日志记录:

 >>> response2 =urllib2.urlopen('http://www.xxxxxxxxltd.com/web/guest/attendancelist')
send: 'GET /web/guest/attendancelist HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.xxxxxxxxltd.com\r\nConnection: close\r\nUser-Agent: Python-urllib/2.6\r\n\r\n'
reply: 'HTTP/1.1 302 Moved Temporarily\r\n'
header: Server: nginx/0.7.67
header: Date: Thu, 28 Nov 2013 19:12:28 GMT
header: Transfer-Encoding: chunked
header: Connection: close
header: Location: http://www.xxxxxxxxplc.com/web/guest/attendancelist
send: 'GET /web/guest/attendancelist HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.xxxxxxxxplc.com\r\nConnection: close\r\nUser-Agent: Python-urllib/2.6\r\n\r\n'
reply: 'HTTP/1.1 301 Moved Permanently\r\n'
header: Server: Apache-Coyote/1.1
header: Location: /home/new/attendancelist.jsp
header: Content-Length: 0
header: Date: Thu, 28 Nov 2013 19:12:26 GMT
header: Connection: close
send: 'GET /home/new/attendancelist.jsp HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.xxxxxxxxplc.com\r\nConnection: close\r\nUser-Agent: Python-urllib/2.6\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Apache-Coyote/1.1
header: Set-Cookie: JSESSIONID=F02B1F76CCCF6F41BE48951F6E1A6205; Path=/home
header: Content-Type: text/html;charset=utf-8
header: Content-Length: 0
header: Date: Thu, 28 Nov 2013 19:12:26 GMT
header: Connection: close

还有……

>>> html3=urllib.urlopen('http://www.xxxxxxxxltd.com/web/guest/attendancelist')
send: 'GET /web/guest/attendancelist HTTP/1.0\r\nHost: www.xxxxxxxxltd.com\r\nUser-Agent: Python-urllib/1.17\r\n\r\n'
reply: 'HTTP/1.1 302 Moved Temporarily\r\n'
header: Server: nginx/0.7.67
header: Date: Thu, 28 Nov 2013 19:10:36 GMT
header: Connection: close
header: Location: http://www.xxxxxxxxplc.com/web/guest/attendancelist
send: 'GET /web/guest/attendancelist HTTP/1.0\r\nHost: www.xxxxxxxxplc.com\r\nUser-Agent: Python-urllib/1.17\r\n\r\n'
reply: 'HTTP/1.1 301 Moved Permanently\r\n'
header: Server: Apache-Coyote/1.1
header: Location: /home/new/attendancelist.jsp
header: Content-Length: 0
header: Date: Thu, 28 Nov 2013 19:10:34 GMT
header: Connection: close
send: 'GET /home/new/attendancelist.jsp HTTP/1.0\r\nHost: www.xxxxxxxxplc.com\r\nUser-Agent: Python-urllib/1.17\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Apache-Coyote/1.1
header: Set-Cookie: JSESSIONID=8CFB903B80C42CA3DA37EDF90D84FF99; Path=/home
header: Content-Type: text/html;charset=utf-8
header: Date: Thu, 28 Nov 2013 19:10:35 GMT
header: Connection: close

可以看出,urllib2 连接流具有明显更多的 Connection 标头(其中之一是 Connection 标头,其值为 Close)。

任何人都可以帮助找出为什么 urllib2 无法检索数据而 urllib 模块运行良好。

我确定它与 Connection 标头有关,但我想要某种确认和思考过程的解释。

谢谢。

【问题讨论】:

  • 我在日志中看到的唯一区别是 Accept-encoding 标头。 urllib 返回什么内容? p.ex.是纯html还是gzip?
  • 真正的问题是,虽然 urllib 返回页面的实际内容(纯文本正确抓取和格式化),但 urllib2 响应不返回任何数据(这由 Content-Length 值确认将 urllib2 标头信息设置为 0。

标签: python http python-2.7 urllib2 urllib


【解决方案1】:

我建议使用 curl 进行调试,以复制两个版本的 urllib 正在使用的标头。通过一些试验和错误,您应该能够找到导致问题的标题并从那里开始。

【讨论】:

  • 感谢您的信息,我会尝试一下。您是否有任何链接可以帮助我使用 CURL 重新创建请求?我有点不确定我们是否需要 curl 命令行(wget 或类似的东西)或者我们可以使用基于浏览器的解决方案(例如 Fiddler)。
猜你喜欢
  • 2010-12-29
  • 2010-09-17
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多