Comment télécharger des ebooks depuis un .onion avec Python3

Sasha Bouloudnine
March 24, 2023
7 min read

Le darknet est un espace mystérieux du net, qui suscite intérêt et méfiance. On y trouve des sites non-indexés par Google, avec des produits plus ou moins légaux: drogues, armes, contrefaçons.

Outre les produits illégaux, dont nous déconseillons bien entendu l’usage, on a également trouvé cette exceptionnelle bibliothèque de livres anarchistes, qui offre plus de 10000 références de livres d’inspiration anarchiste au format .pdf et accessibles entièrement gratuitement.

download-ebooks-from-onion-link-python-requests-image-1.png

Accessible depuis Tor, avec son fameux lien en .onion: http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/special/index

Pourtant, en si l’on essaye d’y accéder rapidement avec Python3, et requests:

import requests r = requests.get('http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/special/index') print(r.text)

Impossible d’y accéder — avec l’impossibilité de télécharger les éléments de la page:

download-ebooks-from-onion-link-python-requests-image-2.png

Que faire?

Dans ce tutoriel, nous allons donc voir comment télécharger, avec Python3 et requests, plus de 100 .pdf accessibles gratuitement sur le darknet.

Et le code est disponible ici en intégralité: https://gist.github.com/lobstrio/8d1c87203755d569da7ce2433179f099

En route vers les sombres contrées du darknet!

🥷

Prérequis

Afin de réaliser ce tutoriel de bout en bout, soyez sur d’avoir les éléments suivants installés sur votre ordinateur.

  1. python3
  2. SublimeText

Vous pouvez cliquer sur les liens ci-dessous, qui vous dirigeront soit vers un tutoriel d’installation, soit vers le site en question.

Pour préciser l’utilité de chacun des éléments cités ci-dessus: python3 est le langage informatique avec lequel nous allons scraper les sites et télécharger les pdf, et SublimeText est un éditeur de texte. Sublime.

À nous de jouer.

Installation

On va procéder comme suit:

  1. installer TorBrowser
  2. installer le package tor

Pour la première étape, il suffit de se rendre ici: https://www.torproject.org/download/

Télécharger ensuite le navigateur qui correspond à votre système d’exploitation. Ici pour moi, Mac OS:

telecharger-ebooks-depuis-lien-onion-python-requests.png

Et suivez ensuite simplement les instructions d’installation:

download-ebooks-from-onion-link-python-requests-image-4.png

Enfin, on va installer requests qui permet de se déplacer sur Internet avec Python, pysocks, qui va nous permettre de nous connecter au réseau de proxies de Tor avec Python, et lxml, qui permet de récupérer les éléments présents sur une page:

$ pip3 install requests $ pip3 install pysocks $ pip3 install lxml

Enfin, on va installer Tor depuis la ligne de commande:

Mac OS

D’abord on installe brew, l’outil d’installation de package de Mac OS:

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Ensuite, on installe tor:

$ brew install tor

On vérifie que tor est bien installé:

$ brew info tor ==> tor: stable 0.4.7.10 (bottled)

Enfin, on lance le service:

$ brew services start tor

Linux

On installe le package:

$ sudo apt install tor

Et on lance la machine:

$ sudo /etc/init.d/tor start

Et voilà, nous sommes prêts à scraper, avec notre navigateur requests directement connecté aux proxies de Tor.

🔥

Le code

Voilà le code en intégralité:

import requests from lxml import html import time print('~~ start') anarchist_library_onion_link = "http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/special/index" latest_books_library_onion_link = "http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/latest?bare=1" session = requests.session() session.proxies = {'http': 'socks5h://localhost:9050', 'https': 'socks5h://localhost:9050'} tor_ip = session.get("https://api.ipify.org/").text local_ip = requests.get("https://api.ipify.org/").text assert all([tor_ip, local_ip]) assert tor_ip != local_ip response = session.get("http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/latest?bare=1", timeout=100) doc = html.fromstring(response.text) items = doc.xpath('//div[@class="list-group"]//div[@class="amw-listing-item"]') for i, item in enumerate(items[:10]): link = "".join(item.xpath('./a/@href')) print(link) response = session.get(link, timeout=100) assert response.ok item_page_doc = html.fromstring(response.text) pdf_link = "".join(item_page_doc.xpath('//span[@id="download-format-pdf"]/a/@href')) assert pdf_link pdf_name = pdf_link.split('/')[-1] pdf_response = session.get(pdf_link, stream=True) with open(pdf_name, 'wb') as fd: for chunk in pdf_response.iter_content(2000): fd.write(chunk) print('✅ %s (%s)' % (pdf_name, i+1)) time.sleep(1) print('~~ success') print(""" _ _ _ | | | | | | | | ___ | |__ ___| |_ __ __ | |/ _ \| '_ \/ __| __/| '__| | | (_) | |_) \__ \ |_ | | |_|\___/|_.__/|___/\__||_| """)

Pour exécuter le code:

  1. télécharger le code .py
  2. lancer le script via la ligne de commande

Et voilà ce qui va apparaître directement sur votre terminal:

$ python3 scraping-anarchists-library-darknet-requests-tor-tutorial.py ~~ start ✅ kevin-carson-may-day.pdf (1) ✅ theodoros-karyotis-ioanna-maria-maravelidi-yavor-tarinski-asking-questions-with-the-zapatistas.pdf (2) ✅ rasmus-hastbacka-six-myths-about-union-action.pdf (3) ✅ asbo-bang-up-and-smash-2nd-edition.pdf (4) ✅ bob-black-fija.pdf (5) ~~ success _ _ _ | | | | | | | | ___ | |__ ___| |_ __ __ | |/ _ \| '_ \/ __| __/| '__| | | (_) | |_) \__ \ |_ | | |_|\___/|_.__/|___/\__||_|

Et les précieux ebooks d’anarchistes, téléchargés gratuitement depuis le darknet, directement sauvegardé sur votre ordinateur:

download-ebooks-from-onion-link-python-requests-image-5.png
🤓

Guide Complet

Le guide va se décomposer en 3 parties.

  1. se connecter aux proxies Tor avec requests et Python
  2. naviguer sur le site
  3. télécharger les pdfs

Tor Proxies

D’abord, connectons-nous aux proxies de Tor avec Python3 et requests, comme suit:

session = requests.session() session.proxies = {'http': 'socks5h://localhost:9050', 'https': 'socks5h://localhost:9050'}

C’est à partir du port 9050 que Tor se connecte à son pool de proxies. Pour plus d’informations, vous pouvez consulter notre article dédié à ce sujet.

Maintenant, on va accéder à https://api.ipify.org, une fois en utilisant tor, une fois en utilisant notre IP local:

tor_ip = session.get("https://api.ipify.org/").text local_ip = requests.get("https://api.ipify.org/").text print(tor_ip) print(local_ip)

Et le résultat est clair:

$ python3 scraping-anarchists-library-darknet-requests-tor-tutorial.py 5.45.106.207 80.125.29.188

2 IPs différentes — nous sommes bien connectés aux proxies de Tor!

Maintenant essayons de nous connecter au site:

response = session.get(latest_books_library_onion_link, timeout=100) print(response.status_code)

Et ici encore, en lançant le script, le message est clair:

$ python3 scraping-anarchists-library-darknet-requests-tor-tutorial.py 200

Plus de page inaccessible. Nous accèdons positivement à ce site présent sur le darknet de façon programmatique, avec requests et Python.

🐍

Page de résultats

Maintenant, nous allons naviguer sur le site.

D’abord, ouvrez Tor Browser, et rendez-vous sur le site en .onion: http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/special/index

Une fois que vous êtes sur le site, ouvrez votre console d’inspection, avec clique droit + Inspect, puis sélectionnez la partie Network.

download-ebooks-from-onion-link-python-requests-image-6.png

Appuyez ensuite sur l’icône de recherche (1) ci-dessous, ce qui va ouvrir l’outil de recherche de requêtes:

download-ebooks-from-onion-link-python-requests-image-7.png

Rechargez la page, et dans l’outil de recherche, sélectionnez un des mots présents sur la page, ici “A short history of May Day”:

download-ebooks-from-onion-link-python-requests-image-8.png

Une requête apparaît! C’est l’URL de cette requête que nous allons récupérer, et insérer directement dans notre code en Python:

response = session.get("http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/latest?bare=1", timeout=100)

Maintenant, nous allons récupérer l’URL de chacune des pages de chaque ouvrage.

En ouvrant la partie Inspector de l’outil d’inspection, on se rend compte que chaque page d’ouvrage est située dans une div qui a pour classe 'amw-listing-item':

download-ebooks-from-onion-link-python-requests-image-9.png

On récupère ce xPath, et enfin, pour chaque div, on va aller chercher le lien présent au sein de l’attribut ‘href’ de la balise ‘a’.

Voilà le code:

response = session.get("http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/latest?bare=1", timeout=100) doc = html.fromstring(response.text) items = doc.xpath('//div[@class="list-group"]//div[@class="amw-listing-item"]') for i, item in enumerate(items[:10]): link = "".join(item.xpath('./a/@href')) print(link)

Et lorsqu’on le lance depuis la ligne de commande, les liens apparaissent distinctement:

$ python3 scraping-anarchists-library-darknet-requests-tor-tutorial.py http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/library/kevin-carson-may-day http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/library/theodoros-karyotis-ioanna-maria-maravelidi-yavor-tarinski-asking-questions-with-the-zapatistas http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/library/rasmus-hastbacka-six-myths-about-union-action http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/library/asbo-bang-up-and-smash-2nd-edition http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/library/bob-black-fija

Magnifique!

Ne nous reste plus qu’à:

  1. nous rendre sur la page de chaque ouvrage
  2. télécharger le livre au format .pdf

Page d’ouvrage

D’abord, on se rend sur la page d’ouvrage avec requests:

response = session.get(link)

Puis depuis le TorBrowser, une fois sur la page d’ouvrage, inspecte la zone avec le lien vers le pdf:

download-ebooks-from-onion-link-python-requests-image-10.png

Il apparaît que le lien se trouve en suivant ce xPath:

'//span[@id="download-format-pdf"]/a/@href'

Enfin, on télécharge le document avec requests:

pdf_link = "".join(item_page_doc.xpath('//span[@id="download-format-pdf"]/a/@href')) assert pdf_link pdf_name = pdf_link.split('/')[-1] pdf_response = session.get(pdf_link, stream=True) with open(pdf_name, 'wb') as fd: for chunk in pdf_response.iter_content(2000): fd.write(chunk)

Et voilà, le tour est joué!

Bénéfices

Ce code va vous permettre de télécharger des documents .pdf avec requests et Python3, directement depuis un site .onion présent sur le dark net.

Un bénéfice culturel évident.

Limitations

Si ce script en Python permet de se connecter à un site .onion avec Python3 et requests, vous ne pourrez télécharger qu’une seule page de résultats. La pagination n’est, elle, pas prise en charge.

Par ailleurs, ce tutoriel ne concerne que la librairie anarchiste présente sur le darknet, accessible via cet URL .onion: http://libraryqxxiqakubqv3dc2bend2koqsndbwox2johfywcatxie26bsad.onion/special/index.

Pour accéder à d’autres sources de données, il va falloir modifier le script conjointement.

Attention, enfin, ce tutoriel est à usage purement éducatif.

Nous nous dégageons donc de toute responsabilité quant à l’usage immodéré qui pourrait en être fait, notamment sur des sites liés à d’autres types de services ou d’autres types de données. Par ailleurs, nous souhaitons vous rappeler que, selon la législation du pays dans lequel vous opérez, il est strictement interdit de posséder des textes protégés par le droit d’auteur, sans offrir la rémunération juste qui en revient à l’auteur. Aussi, nous vous recommandons fortement de consulter les législations en vigueur dans votre pays d’exercice avant de vous engager dans une quelconque démarche de développement informatique comme illustré ci-avant.

Conclusion

Et c’est la fin du tutoriel!

Dans ce tutoriel, nous avons vu comment télécharger des .pdf depuis une librairie anarchiste en .onion présente sur le darknet, avec requestset Python3.

Si vous avez des questions, ou si vous avez besoin d’un service de scraping sur-mesure, solide et scalable, nous restons bien entendu à votre disposition ici.

Happy scraping!

🦀

Share this article
Code