urllib2 HTTP Error 400: Bad Request

前端 未结 5 1821
伪装坚强ぢ
伪装坚强ぢ 2020-11-30 05:04

I have a piece of code like this

host = \'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s\' % (query, page)
req = urllib2.         


        
相关标签:
5条回答
  • 2020-11-30 05:20

    Here is an example of how to use urllib.request object in Python 3.6 and above.

    import urllib.request
    import json
    from pprint import pprint
    
    url = "some_url"
    
    values = {
        "first_name": "Vlad",
        "last_name": "Bezden",
        "urls": [
            "https://twitter.com/VladBezden",
            "https://github.com/vlad-bezden",
        ],
    }
    
    
    headers = {
        "Content-Type": "application/json",
        "Accept": "application/json",
    }
    
    data = json.dumps(values).encode("utf-8")
    pprint(data)
    
    try:
        req = urllib.request.Request(url, data, headers)
        with urllib.request.urlopen(req) as f:
            res = f.read()
        pprint(res.decode())
    except Exception as e:
        pprint(e)
    
    0 讨论(0)
  • 2020-11-30 05:31

    I also encountered the same problem. Turns out the problem was the method was set inappropriately. When you include urlencoded data in urllib2.urlopen () the method should be set to POST and when you exclude it, method should be GET. So, how do you set the method is given below:

    For POST request

    request_object = urllib2.Request(url)
    method = ("POST", "GET")
    request_object.get_method = lambda: method[0] #If method is set to POST
    url_handle = opener.open(req, data) #If method is set to POST
    

    For GET request

    request_object = urllib2.Request(url)
    method = ("POST", "GET")
    request_object.get_method = lambda: method[1] #If method is set to GET
    url_handle = opener.open(req) #If method is set to GET
    

    This will set your url request method to the appropriate required method

    0 讨论(0)
  • 2020-11-30 05:36

    The reason that "the dog" returns a 400 Error is because you aren't escaping the string for a URL.

    If you do this:

    import urllib, urllib2
    
    quoted_query = urllib.quote(query)
    host = 'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s' % (quoted_query, page)
    req = urllib2.Request(host)
    req.add_header('User-Agent', User_Agent)
    response = urllib2.urlopen(req)
    

    It will work.

    However I highly suggest you use requests instead of using urllib/urllib2/httplib. It's much much easier and it'll handle all of this for you.

    This is the same code with python requests:

    import requests
    
    results = requests.get("http://www.bing.com/search", 
                  params={'q': query, 'first': page}, 
                  headers={'User-Agent': user_agent})
    
    0 讨论(0)
  • 2020-11-30 05:39

    you have to use urllib.quote

    0 讨论(0)
  • 2020-11-30 05:42

    You need to use urllib.quote() on your 'query' variable:

    query = urllib.quote(query)
    host = 'http://www.bing.com/search?q=%s&go=&qs=n&sk=&sc=8-13&first=%s' % (query, page)
    

    This does the necessary URL escaping to convert the space in big dog to big%20dog.

    0 讨论(0)
提交回复
热议问题