Use Shifter with Python
Integrate Shifter's residential and ISP proxies into your Python scripts in minutes. Works seamlessly with requests, aiohttp, Scrapy, Selenium, and every major Python HTTP library.
Quick Start
Install
pip install requests Basic Usage
import requests
proxy_url = "customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443"
proxies = {
"http": proxy_url,
"https": proxy_url,
}
response = requests.get("https://ipinfo.io/json", proxies=proxies)
print(response.json())
# {"ip": "154.16.xxx.xxx", "city": "New York", "country": "US", ...} Features
Examples
Basic Requests
The simplest way to use Shifter proxies with Python's most popular HTTP library. Set country, region, city, or ASN directly in the username and pass a `sid` to keep the same IP across requests.
import requests
PROXY_USER = "customer-USERNAME-country-us-sid-123ABC"
PROXY_PASS = "PASSWORD"
PROXY_HOST = "p.shifter.io"
PROXY_PORT = "443"
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(
"https://example.com",
proxies=proxies,
headers=headers,
timeout=30,
)
print(f"Status: {response.status_code}")
print(f"Content length: {len(response.text)}") Async with aiohttp + Sticky Sessions
Use aiohttp for high-performance asynchronous scraping. Add `sid-XXX` to the username to keep the same IP across requests, or `ttl-N` for a timed sticky session of N seconds.
import aiohttp
import asyncio
import uuid
# sid pins the same IP for every request that shares this session id;
# ttl-300 keeps that IP for up to 300 seconds, then rotates.
session_id = uuid.uuid4().hex[:8]
PROXY_URL = (
f"customer-USERNAME-country-us-sid-{session_id}-ttl-300:"
f"PASSWORD@p.shifter.io:443"
)
async def fetch(session, url):
async with session.get(
url, proxy=PROXY_URL, timeout=aiohttp.ClientTimeout(total=30)
) as response:
return await response.text()
async def main():
urls = [
"https://example.com/login",
"https://example.com/dashboard",
"https://example.com/orders",
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks, return_exceptions=True)
for url, result in zip(urls, results):
if isinstance(result, Exception):
print(f"Error fetching {url}: {result}")
else:
print(f"Fetched {url}: {len(result)} bytes")
asyncio.run(main()) Scrapy Middleware
Integrate Shifter proxies into your Scrapy spiders with a custom downloader middleware. Geo-target by adding selectors like `country-uk`, `region-bavaria`, `city-london`, or `asn-7922` to the username, and pin the session with a `sid`.
# middlewares.py
class ShifterProxyMiddleware:
PROXY_USER = "customer-USERNAME-country-uk-sid-456DEF"
PROXY_PASS = "PASSWORD"
PROXY_HOST = "p.shifter.io"
PROXY_PORT = "443"
def process_request(self, request, spider):
request.meta["proxy"] = (
f"http://{self.PROXY_USER}:{self.PROXY_PASS}"
f"@{self.PROXY_HOST}:{self.PROXY_PORT}"
)
# settings.py
DOWNLOADER_MIDDLEWARES = {
"myproject.middlewares.ShifterProxyMiddleware": 350,
}
# spider.py
import scrapy
class ProductSpider(scrapy.Spider):
name = "products"
start_urls = ["https://example.co.uk/products"]
def parse(self, response):
for product in response.css(".product-card"):
yield {
"title": product.css("h2::text").get(),
"price": product.css(".price::text").get(),
"url": product.css("a::attr(href)").get(),
}
next_page = response.css("a.next-page::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse) Selenium WebDriver
Route Selenium browser automation through Shifter proxies. Ideal for scraping JavaScript-rendered pages. Combine city-level targeting with a `sid` to keep the same IP for the entire browser session.
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
PROXY_HOST = "p.shifter.io"
PROXY_PORT = "443"
PROXY_USER = "customer-USERNAME-country-us-city-newyork-sid-789GHI"
PROXY_PASS = "PASSWORD"
chrome_options = Options()
chrome_options.add_argument(
f"--proxy-server=http://{PROXY_HOST}:{PROXY_PORT}"
)
driver = webdriver.Chrome(options=chrome_options)
# Handle proxy authentication via browser extension or seleniumwire if needed
driver.get("https://example.com")
# Wait for dynamic content to load
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".content"))
)
print(f"Page title: {driver.title}")
print(f"Content: {element.text[:200]}")
driver.quit() Frequently asked FAQ questions
Common questions about using Shifter with Python.
Pass a proxies dictionary to any requests method with your Shifter proxy URL. The format is: proxies = {"http": "customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443", "https": "customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443"}. Then call requests.get(url, proxies=proxies).
Start Using Shifter with Python
Integrate Shifter's 205M+ residential proxies into your Python scripts in under 5 minutes. Flexible IP rotation, geo-targeting, and full compatibility with every major Python library.