Sending POST Requests with Python's urllib

Feb 6, 2024 ยท 2 min read

The urllib module in Python provides useful functionality for sending HTTP requests and handling responses. A common task is to send POST requests to web servers, for example when submitting form data or making API calls. Here's how to do POST requests properly with urllib.

First, we need to import urllib and urllib.parse:

import urllib.parse
import urllib.request

We use urllib.parse to encode any data we want to send. For example:

data = urllib.parse.urlencode({'name': 'John Smith', 'email': ''})
data = data.encode('ascii')

This encodes the data as a URL-encoded string ready for sending.

Next we create a request object and specify that it's a POST request:

req = urllib.request.Request(url, data=data) 
req.add_header('Content-Type', 'application/x-www-form-urlencoded')
req.get_method = lambda: 'POST'

Note that we set the Content-Type header to match the encoded data, and explicitly set the method to POST.

To actually send the request and get the response:

with urllib.request.urlopen(req) as f:

This sends the request, prints the decoded response text, and handles opening and closing the connection.

Some key points to remember:

  • Use urllib.parse to encode any data you want to send
  • Set the request method to POST
  • Add headers like Content-Type to match the data
  • Handle decoding responses if needed
  • Sending POST requests allows you to submit data to APIs and web applications for processing. With urllib it's straightforward to do this directly from Python scripts.

    Browse by tags:

    Browse by language:

    The easiest way to do Web Scraping

    Get HTML from any page with a simple API call. We handle proxy rotation, browser identities, automatic retries, CAPTCHAs, JavaScript rendering, etc automatically for you

    Try ProxiesAPI for free

    curl ""

    <!doctype html>
        <title>Example Domain</title>
        <meta charset="utf-8" />
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />


    Don't leave just yet!

    Enter your email below to claim your free API key: