sudo lsof -i:1080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sslocal 1795 root 4u IPv4 16233 0t0 TCP localhost:socks (LISTEN)
sslocal 1795 root 5u IPv4 16234 0t0 UDP localhost:socks

An app was listening on localhost:1080,it is ready for curl's socks5 proxy.
The app provided socks5 proxy service is shadowsocks client on my pc.

curl can work with socks proxy in my pc.

target="target_url_youtube"
curl --socks5-hostname 127.0.0.1:1080 $target -o /tmp/sample

The target url can be downloaded with scoks5 proxy in curl.

shadowsocks client------->shadowsocks server--->target_url_youtube
127.0.0.1:1080 1xx.1xx.1xx.1xxort target_url_youtube

Notice:
All the packages from 127.0.0.1:1080 to 1xx.1xx.1xx.1xxort is sent and received by shadowsocks client and server.
curl just sent packages to 127.0.0.1:1080.


Now i want to get the target webpage with socks proxy in python3.

the first try :

import urllib.request
target="target_url_youtubr"
proxy_support = urllib.request.ProxyHandler({'sock5': 'localhost:1080'})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
web = urllib.request.urlopen(target).read()
print(web)

The error info:
sock.connect(sa)
OSError: [Errno 101] Network is unreachable

Notice:
It is no use to write {'sock5': 'localhost:1080'} as {'sock5': '127.0.0.1:1080'},i have verified it.

the second try:

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
import urllib.request
target="target_url_youtubr"
print(urllib.request.urlopen('target').read())

error info:
raise BadStatusLine(line)
http.client.BadStatusLine:

The third try:

import socks
import socket
from urllib import request
socks.set_default_proxy(socks.SOCKS5, "localhost", 1080)
socket.socket = socks.socksocket
target="target_url_youtube"
r = request.urlopen(url)
print(r.read())

ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:600)
urllib.error.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:600)>

Why data packet can't send via localhost:1080 and get the target_url_youtube's content,but curl can?
How to fix my python3 code for socks5 proxy?

shadowsocks client---------->shadowsocks server------>target_url_youtube
127.0.0.1:1080 1xx.1xx.1xx.1xxort target_url_youtube
`curl --socks5-hostname 127.0.0.1:1080 $target -o /tmp/sample` can do the job.
why all the three python codes can't do?
How to fix it?