【问题标题】:python - urrlib2 request https site - getting 400 errorpython - urrlib2 请求 https 站点 - 出现 400 错误
【发布时间】:2009-12-19 22:18:35
【问题描述】:

使用以下代码片段访问带有帖子的网址。

我可以使用 wget 和以下内容获取它: wget --post-data 'p_calling_proc=bwckschd.p_disp_dyn_sched&p_term=201010' https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date

由于某种原因,我的 python 文本有问题,我得到一个错误代码 400。(当然浏览器按预期工作)

任何想法/cmets/等等...

我的python测试:

//============================================

import urllib 
import urllib2
import sys, string
import time
import mechanize

Request = urllib2.Request
urlopen = urllib2.urlopen

headers ={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
query = "p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010"
url1="https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date"

req = Request(url1, query, headers)

test1=0
test=0
while test==0:
  print "aaaaattttt \n"
  try: 
    res = urlopen(req)
    #req = Request(url1, query, headers)
    print "aaaappppp \n"
    #urllib2.URLError, (e)
    #print e
  except urllib2.HTTPError, e:
    print "ffff1111 "+str(e.code)+"\n"
    if e.code:
      test1=1
      print "error ..sleep \n"
      time.sleep(1)
    else:
      test1=0
  except urllib2.URLError, e:
    print e.reason
    #print "ffff3333 "+e.code+"\n"
    if e.reason:
      test1=1
      print "error ..sleep \n"
      time.sleep(1)
    else:
      test1=0
  #print "ddd "+e.code +"\n"
  #print e
  if test1==0:
    test=1

print "test1 = "+str(test1)+"\n"
#res = urlopen(req)
print "gggg 000000000000\n"
s = res.read()

.


任何想法/cmets 将不胜感激..

谢谢

【问题讨论】:

    标签: python https parsing request urllib2


    【解决方案1】:

    尝试不对查询字符串进行编码。 POST 数据中的 & 和 = 不必是 urlencoded。如果远程端的 web 应用程序不期望查询字符串中的 %xx 编码,它将无法解析它。

    这是 curl 的 HTTP 请求标头:

    POST / HTTP/1.1
    User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3
    Host: 127.0.0.1 
    Accept: */*
    Content-Length: 188
    Expect: 100-continue
    
    bwckschd.p_disp_dyn_sched&p_term=201010
    

    这是来自您的 python 的 HTTP 请求标头:

    POST / HTTP/1.1
    Accept-Encoding: identity
    Content-Length: 60
    Host: 127.0.0.1
    Content-Type: application/x-www-form-urlencoded
    Connection: close
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)
    
    p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010
    

    【讨论】:

    • “POST数据不需要进行urlencoded,因为它放在HTTP请求的正文中”是错误的。 POSTed 表单数据的 content-type 为application/x-www-form-urlencoded
    • @Jonathan -- 读起来很清楚,嗯?谢谢,我编辑了帖子以澄清 urlencoding,我当然想歪了。
    【解决方案2】:

    我认为您的查询字符串不太正确。尝试使用 urllib.urlencode() 方法生成查询,一拉

    urllib.urlencode([ ('param1', value1), ('param2',value2) ])
    

    【讨论】:

    • 我提供的查询“是”urlencoded 查询.. 初始查询是:query === p_calling_proc=bwckschd.p_disp_dyn_sched&p_term=201010 >>> p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010
    • 嗨乔恩...感谢您的评论!!!经过思考..我尝试使用未编码的查询..它似乎工作!谢谢
    猜你喜欢
    • 2013-12-22
    • 2019-07-17
    • 1970-01-01
    • 2016-12-08
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多