Remove py35 from CI
diff --git a/.travis.yml b/.travis.yml
index 33a920bb6d8..b883c5b78d3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,16 +19,10 @@ matrix:
       python: 3.8
 
     - env: TOXENV=pinned
-      python: 3.5.2
+      python: 3.6.1
     - env: TOXENV=asyncio-pinned
-      python: 3.5.2  # We use additional code to support 3.5.3 and earlier
-    - env: TOXENV=pypy3-pinned PYPY_VERSION=3-v5.9.0
-
-    - env: TOXENV=py
-      python: 3.5
-    - env: TOXENV=asyncio
-      python: 3.5  # We use specific code to support >= 3.5.4, < 3.6
-    - env: TOXENV=pypy3 PYPY_VERSION=3.5-v7.0.0
+      python: 3.6.1
+    - env: TOXENV=pypy3-pinned PYPY_VERSION=3.6-v7.2.0
 
     - env: TOXENV=py
       python: 3.6
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 710e4209092..c03e258c7a3 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -4,11 +4,9 @@ pool:
   vmImage: 'windows-latest'
 strategy:
   matrix:
-    Python35:
-      python.version: '3.5'
-      TOXENV: windows-pinned
     Python36:
       python.version: '3.6'
+      TOXENV: windows-pinned
     Python37:
       python.version: '3.7'
     Python38:
diff --git a/tests/test_utils_python.py b/tests/test_utils_python.py
index c298d0bd217..3115cc92f1f 100644
--- a/tests/test_utils_python.py
+++ b/tests/test_utils_python.py
@@ -3,8 +3,8 @@
 import operator
 import platform
 import unittest
+from datetime import datetime
 from itertools import count
-from sys import version_info
 from warnings import catch_warnings
 
 from scrapy.utils.python import (
@@ -216,15 +216,15 @@ def __call__(self, a, b, c):
             self.assertEqual(get_func_args(str.split), [])
             self.assertEqual(get_func_args(" ".join), [])
             self.assertEqual(get_func_args(operator.itemgetter(2)), [])
-        else:
-            self.assertEqual(
-                get_func_args(str.split, stripself=True), ['sep', 'maxsplit'])
-            self.assertEqual(
-                get_func_args(operator.itemgetter(2), stripself=True), ['obj'])
-            if version_info < (3, 6):
-                self.assertEqual(get_func_args(" ".join, stripself=True), ['list'])
-            else:
+        elif platform.python_implementation() == 'PyPy':
+            self.assertEqual(get_func_args(str.split, stripself=True), ['sep', 'maxsplit'])
+            self.assertEqual(get_func_args(operator.itemgetter(2), stripself=True), ['obj'])
+
+            build_date = datetime.strptime(platform.python_build()[1], '%b %d %Y')
+            if build_date >= datetime(2020, 4, 7):  # PyPy 3.6-v7.3.1
                 self.assertEqual(get_func_args(" ".join, stripself=True), ['iterable'])
+            else:
+                self.assertEqual(get_func_args(" ".join, stripself=True), ['list'])
 
     def test_without_none_values(self):
         self.assertEqual(without_none_values([1, None, 3, 4]), [1, 3, 4])
diff --git a/tox.ini b/tox.ini
index 4f5531aeada..dec0d75e8e0 100644
--- a/tox.ini
+++ b/tox.ini
@@ -14,7 +14,7 @@ deps =
     # Extras
     boto3>=1.13.0
     botocore>=1.4.87
-    Pillow>=3.4.2
+    Pillow>=4.0.0
 passenv =
     S3_TEST_FILE_URI
     AWS_ACCESS_KEY_ID
@@ -78,7 +78,7 @@ deps =
     # Extras
     botocore==1.4.87
     google-cloud-storage==1.29.0
-    Pillow==3.4.2
+    Pillow==4.0.0
 
 [testenv:pinned]
 deps =

Closes #4732