Si vous faites du WebScraping, vous connaissez sûrement Scrapy. C’est un framework de développement spécialisé dans ce domaine. Il est développé en Python. Comment l’installer ? Et bien avec le gestionnaire de paquets de Python ! Pourtant, ce n’est pas aussi simple sous Windows…

PIP

Le premier réflexe est d’utiliser PIP mais vous risquez d’obtenir ce message d’erreur :

$ pip install scrapy

running build_ext
building 'twisted.test.raiser' extension
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

----------------------------------------
Command ""c:\program files (x86)\python36-32\python.exe" -u -c "import setuptools, tokenize;__file__='C:\\Users\\pnom\\AppData\\Local\\Temp\\pip-build-objb7zhn\\Twisted\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record C:\Users\pnom\AppData\Local\Temp\pip-jrlu6snx-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in C:\Users\pnom\AppData\Local\Temp\pip-build-objb7zhn\Twisted\

Selon votre version de Python1, il faut installer la bonne version Visual C++ Build Tools sans oublier d’inclure le SDK correspondant à votre version de Windows.

$ pip install scrapy
Collecting scrapy
Using cached Scrapy-1.4.0-py2.py3-none-any.whl
Requirement already satisfied: six>=1.5.2 in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: cssselect>=0.9 in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: lxml in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: pyOpenSSL in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: w3lib>=1.17.0 in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: parsel>=1.1 in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: queuelib in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: PyDispatcher>=2.0.5 in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Requirement already satisfied: service-identity in c:\program files (x86)\python36-32\lib\site-packages (from scrapy)
Collecting Twisted>=13.1.0 (from scrapy)
Using cached Twisted-17.9.0.tar.bz2
Requirement already satisfied: cryptography>=1.9 in c:\program files (x86)\python36-32\lib\site-packages (from pyOpenSSL->scrapy)
Requirement already satisfied: pyasn1-modules in c:\program files (x86)\python36-32\lib\site-packages (from service-identity->scrapy)
Requirement already satisfied: pyasn1 in c:\program files (x86)\python36-32\lib\site-packages (from service-identity->scrapy)
Requirement already satisfied: attrs in c:\program files (x86)\python36-32\lib\site-packages (from service-identity->scrapy)
Requirement already satisfied: zope.interface>=4.0.2 in c:\program files (x86)\python36-32\lib\site-packages (from Twisted>=13.1.0->scrapy)
Requirement already satisfied: constantly>=15.1 in c:\program files (x86)\python36-32\lib\site-packages (from Twisted>=13.1.0->scrapy)
Requirement already satisfied: incremental>=16.10.1 in c:\program files (x86)\python36-32\lib\site-packages (from Twisted>=13.1.0->scrapy)
Requirement already satisfied: Automat>=0.3.0 in c:\program files (x86)\python36-32\lib\site-packages (from Twisted>=13.1.0->scrapy)
Requirement already satisfied: hyperlink>=17.1.1 in c:\program files (x86)\python36-32\lib\site-packages (from Twisted>=13.1.0->scrapy)
Requirement already satisfied: idna>=2.1 in c:\program files (x86)\python36-32\lib\site-packages (from cryptography>=1.9->pyOpenSSL->scrapy)
Requirement already satisfied: cffi>=1.7 in c:\program files (x86)\python36-32\lib\site-packages (from cryptography>=1.9->pyOpenSSL->scrapy)
Requirement already satisfied: asn1crypto>=0.21.0 in c:\program files (x86)\python36-32\lib\site-packages (from cryptography>=1.9->pyOpenSSL->scrapy)
Requirement already satisfied: setuptools in c:\program files (x86)\python36-32\lib\site-packages (from zope.interface>=4.0.2->Twisted>=13.1.0->scrapy)
Requirement already satisfied: pycparser in c:\program files (x86)\python36-32\lib\site-packages (from cffi>=1.7->cryptography>=1.9->pyOpenSSL->scrapy)
Installing collected packages: Twisted, scrapy
Running setup.py install for Twisted ... done
Successfully installed Twisted-17.9.0 scrapy-1.4.0
$ scrapy version
Scrapy 1.4.0

Scrapy est fonctionnel mais nous venons d’installer 3 à 6 Go de dépendance… N’y a-t-il pas plus léger ?

Docker

Si vous utilisez déjà Docker, il est alors très simple d’installer Scrapy.

$ docker run --rm -ti -v /`pwd`:`pwd` -w /`pwd` vimagick/scrapyd scrapy version
Scrapy 1.4.0

Cependant, si vous n’utilisez pas régulièrement Docker et que vous n’avez pas Docker for Windows, celà peut s’avérer peu confortable de démarrer une VM pour Docker à chaque fois que vous avez besoin de Scrapy…

Conda

Il reste alors une dernière alternative avec Conda. Ce gestionnaire de paquets et dépendances supportent de nombreux langages dont le Python. Il existe deux distributions pour utiliser Conda sur Windows : Anaconda et Miniconda. La première pré-installe de nombreux paquets et pèse plus de 3 Go. Alors que la seconde n’installe que les dépendances nécessaires à l’exécution de conda.

Une fois Miniconda installé, voici comment installer Scrapy :

$ conda install scrapy
Fetching package metadata .............
Solving package specifications: .

Package plan for installation in environment C:\Users\pnom\Miniconda3:

The following NEW packages will be INSTALLED:

    appdirs:          1.4.3-py36_0
    attrs:            17.3.0-py36hc87868e_0
    automat:          0.6.0-py36hc6d8c19_0
    constantly:       15.1.0-py36_0
    coverage:         4.4.2-py36hd32d05b_0
    cssselect:        1.0.1-py36h9989782_0
    hyperlink:        17.1.1-py36_0
    hypothesis:       3.38.5-py36h987501d_0
    incremental:      17.5.0-py36he5b1da3_0
    libiconv:         1.15-h1df5818_7
    libxml2:          2.9.4-h41ea7b2_6
    libxslt:          1.1.29-h0037b19_6
    lxml:             4.1.1-py36he0adb16_0
    parsel:           1.2.0-py36_0
    pyasn1:           0.4.2-py36h22e697c_0
    pyasn1-modules:   0.2.1-py36hd1453cb_0
    pydispatcher:     2.0.5-py36_0
    pympler:          0.5-py36h863af32_0
    queuelib:         1.4.2-py36_0
    scrapy:           1.4.0-py36h764da0a_1
    service_identity: 17.0.0-py36_0
    twisted:          17.9.0-py36hfad864c_0
    w3lib:            1.18.0-py36h47df3ce_0
    zlib:             1.2.11-h8395fce_2
    zope:             1.0-py36_0
    zope.interface:   4.4.3-py36h56cab3c_0

The following packages will be UPDATED:

    conda:            4.3.31-py36_0         --> 4.4.4-py36_0

Proceed ([y]/n)? y

libiconv-1.15- 100% |###############################| Time: 0:00:02 268.92 kB/s
zlib-1.2.11-h8 100% |###############################| Time: 0:00:01 202.03 kB/s
appdirs-1.4.3- 100% |###############################| Time: 0:00:01  12.69 kB/s
constantly-15. 100% |###############################| Time: 0:00:00 411.33 kB/s
coverage-4.4.2 100% |###############################| Time: 0:00:02 116.15 kB/s
cssselect-1.0. 100% |###############################| Time: 0:00:00  63.45 kB/s
hyperlink-17.1 100% |###############################| Time: 0:00:00 218.66 kB/s
incremental-17 100% |###############################| Time: 0:00:00 162.68 kB/s
libxml2-2.9.4- 100% |###############################| Time: 0:00:20 159.71 kB/s
pyasn1-0.4.2-p 100% |###############################| Time: 0:00:00 154.68 kB/s
pydispatcher-2 100% |###############################| Time: 0:00:00 194.36 kB/s
pympler-0.5-py 100% |###############################| Time: 0:00:01 214.31 kB/s
queuelib-1.4.2 100% |###############################| Time: 0:00:00 147.62 kB/s
zope-1.0-py36_ 100% |###############################| Time: 0:00:00 183.81 kB/s
libxslt-1.1.29 100% |###############################| Time: 0:00:02 216.64 kB/s
pyasn1-modules 100% |###############################| Time: 0:00:00 209.03 kB/s
w3lib-1.18.0-p 100% |###############################| Time: 0:00:00 288.31 kB/s
lxml-4.1.1-py3 100% |###############################| Time: 0:00:04 245.57 kB/s
zope.interface 100% |###############################| Time: 0:00:01 147.69 kB/s
parsel-1.2.0-p 100% |###############################| Time: 0:00:00  25.95 kB/s
conda-4.4.4-py 100% |###############################| Time: 0:00:03 185.63 kB/s
attrs-17.3.0-p 100% |###############################| Time: 0:00:00 255.85 kB/s
automat-0.6.0- 100% |###############################| Time: 0:00:00 274.12 kB/s
hypothesis-3.3 100% |###############################| Time: 0:00:00 248.21 kB/s
service_identi 100% |###############################| Time: 0:00:00 172.29 kB/s
twisted-17.9.0 100% |###############################| Time: 0:00:29 168.34 kB/s
scrapy-1.4.0-p 100% |###############################| Time: 0:00:01 309.04 kB/s
$ scrapy.exe version
Scrapy 1.4.0

Conclusion

Peu importe que vous souhaitez installer Scrapy ou non, l’intérêt ici était de montrer les différentes façon d’installer des utilitaires écrits en Python quand on est sous Windows.

En vous souhaitant un happy web scraping !

  1. La version 2015 pour la 3.6 et la version 2017 pour la 3.7. Source : https://www.scivision.co/python-windows-visual-c++-14-required/