この記事は何か?

Python で Socks プロキシを経由して目的とするサーバにアクセスする方法について書いた記事である。わたしは Python 3.8 環境で実験したけれど、Python 3 系であればバージョンを問わず同じように動かせるはずである。

具体的なコード

requestsPySocks が導入された状態で、次のようにプロキシの設定をする。なお、Socks プロキシそのものを作成する方法はこちらの記事を参考にしてほしい。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests

proxies = {
    'http' : "socks5h://localhost:1080",
    'https' : "socks5h://localhost:1080"
}

requests.get('http://somewhere.example.internal/ping', proxies=proxies)

何がハマりどころかというと、Socks プロキシの記述で socks5://localhost:1080 ではなく、socks5h://localhost:1080 としなければならない点である。そうでない場合、DNS での名前解決をローカルで行うため、Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known のようなエラーメッセージを見ることになる。