diff --git a/setup.py b/setup.py
index 40d37901d1..6654660ba7 100644
--- a/setup.py
+++ b/setup.py
@@ -1,14 +1,8 @@
 #!/usr/bin/env python
-from setuptools import (
-    find_packages,
-    setup,
-)
+from setuptools import find_packages, setup
 
 extras_require = {
-    "tester": [
-        "eth-tester[py-evm]==v0.9.1-b.1",
-        "py-geth>=3.11.0",
-    ],
+    "tester": ["eth-tester[py-evm]==v0.9.1-b.1", "py-geth>=3.11.0"],
     "linter": [
         "black>=22.1.0",
         "flake8==3.8.3",
@@ -18,11 +12,7 @@
         "types-requests>=2.26.1",
         "types-protobuf==3.19.13",
     ],
-    "docs": [
-        "sphinx>=5.3.0",
-        "sphinx_rtd_theme>=1.0.0",
-        "towncrier>=21,<22",
-    ],
+    "docs": ["sphinx>=5.3.0", "sphinx_rtd_theme>=1.0.0", "towncrier>=21,<22"],
     "dev": [
         "bumpversion",
         "flaky>=3.7.0",
@@ -40,9 +30,7 @@
         "when-changed>=0.3.0",
         "build>=0.9.0",
     ],
-    "ipfs": [
-        "ipfshttpclient==0.8.0a2",
-    ],
+    "ipfs": ["ipfshttpclient==0.8.0a2"],
 }
 
 extras_require["dev"] = (
@@ -68,7 +56,7 @@
     url="https://github.com/ethereum/web3.py",
     include_package_data=True,
     install_requires=[
-        "aiohttp>=3.7.4.post0",
+        "aiohttp>=3.7.4.post0;sys_platform!='emscripten'",
         "eth-abi>=4.0.0",
         "eth-account>=0.8.0",
         "eth-hash[pycryptodome]>=0.5.1",
@@ -81,8 +69,11 @@
         "pywin32>=223;platform_system=='Windows'",
         "requests>=2.16.0",
         "typing-extensions>=4.0.1",
-        "websockets>=10.0.0",
+        "websockets>=10.0.0;sys_platform!='emscripten'",
         "pyunormalize>=15.0.0",
+        # pyodide includes - unversioned to use the one from pyodide distribution
+        "micropip;sys_platform=='emscripten'",
+        "pyodide-http;sys_platform=='emscripten'",
     ],
     python_requires=">=3.7.2",
     extras_require=extras_require,
diff --git a/web3/__init__.py b/web3/__init__.py
index ada63485ea..12c1b16fbb 100644
--- a/web3/__init__.py
+++ b/web3/__init__.py
@@ -1,22 +1,76 @@
 from eth_account import Account  # noqa: E402,
 import pkg_resources
+import sys
 
-from web3.main import (
-    AsyncWeb3,
-    Web3,
-)
-from web3.providers.async_rpc import (  # noqa: E402
-    AsyncHTTPProvider,
-)
-from web3.providers.eth_tester import (  # noqa: E402
-    EthereumTesterProvider,
-)
-from web3.providers.ipc import (  # noqa: E402
-    IPCProvider,
-)
-from web3.providers.rpc import (  # noqa: E402
-    HTTPProvider,
-)
+if sys.platform == "emscripten":
+    # pyodide has a built in patcher which makes the requests module work
+    from pyodide_http import patch_all
+
+    patch_all()
+    # asynchronous connections and websockets aren't supported on
+    # emscripten yet.
+    # We mock the aiohttp and websockets module so that things import okay
+    from micropip import add_mock_package
+
+    add_mock_package(
+        "aiohttp",
+        "1.0.0",
+        modules={
+            "aiohttp": """
+class __NotImplemented:
+    def __init__(self,*args,**argv):
+        raise NotImplementedError(
+            "Async web3 functions aren't supported on pyodide yet"
+        )
+class ClientSession(__NotImplemented):
+    pass
+class ClientResponse(__NotImplemented):
+    pass
+class ClientTimeout(__NotImplemented):
+    pass
+"""
+        },
+    )
+    # mock websockets
+    add_mock_package(
+        "websockets",
+        "1.0.0",
+        modules={
+            "websockets": """
+class __NotImplemented:
+    def __init__(self,*args,**argv):
+        raise NotImplementedError(
+            "Async web3 functions aren't supported on pyodide yet"
+        )
+""",
+            "websockets.legacy": "",
+            "websockets.legacy.client": """
+from websockets import __NotImplemented
+class WebSocketClientProtocol(__NotImplemented):
+    pass
+""",
+            "websockets.client": """
+def connect(*args,**argv):
+        raise NotImplementedError(
+            "Websockets aren't supported on pyodide yet"
+        )
+""",
+            "websockets.exceptions": """
+from websockets import __NotImplemented
+class WebSocketException(__NotImplemented):
+    pass
+class ConnectionClosedOK(__NotImplemented):
+    pass
+""",
+        },
+    )
+
+
+from web3.main import AsyncWeb3, Web3  # noqa: E402
+from web3.providers.async_rpc import AsyncHTTPProvider  # noqa: E402
+from web3.providers.eth_tester import EthereumTesterProvider  # noqa: E402
+from web3.providers.ipc import IPCProvider  # noqa: E402
+from web3.providers.rpc import HTTPProvider  # noqa: E402
 from web3.providers.websocket import (  # noqa: E402
     WebsocketProvider,
     WebsocketProviderV2,