Web scraping avec Tor 🕵

web scraping proxy tor
webscraping tor 
vmware tor

Webscraping tor

Dans les articles précédents on a vu comment automatiser Vmware et démarrer et arrêter des VM directement dans nos scripts python.

Puis on à vu comment installer un proxy Tor sur une VM.

Justement dans cet article on va voir comment configurer un web scraping proxy tor pour passer inaperçu quand on scrape et éviter les ban IP.

On va aussi voir comment générer un user-agent.

schéma web scraping proxy avec vm proxy tor

Prérequis – Web scraping proxy Tor

  • Vmrest activé
  • VM proxy tor configuré

Si ce n’est pas le cas pour vous, vous pouvez suivre les tutos :

On pose les bases

Pour commencer on se place dans notre dossier de travail.

On récupère le projet vmrest_api :

git clone https://gitlab.com/babidi34/vmrest_api.git

Requests avec le proxy tor

On créée notre fichier tor_requests.py puis on import les modules requis

from time import sleep, time
import requests
# for import module vmrest
from vmrest_api import config, vm_fonctions
from stem import Signal
from stem.control import Controller

On démarre ensuite notre VM tor :

vm_fonctions.power_on(config.id_tor)

On initialise notre variable proxies :

proxies = {
    'http': 'socks5://172.16.13.50:9050',
    'https': 'socks5://172.16.13.50:9050'
}

Remplacer « 172.16.13.50 » par l’adresse IP de votre VM tor

Maintenant lançons une requête vers api.ipify pour afficher notre nouvelle IP du réseau TOR :

requete1 = requests.get('https://api.ipify.org', proxies=proxies)
print(requete1.text)

Si vous lancez plusieurs fois la requête vous remarquerez que l’adresse IP ne change pas.

Obtenir une iP différente à chaque requête

  1. Vous devez éditer /etc/tor/torrc sur la VM Tor et ajouter :
ControlPort 9051
ControlPort  172.16.13.50:9051 

Remplacer « 172.16.13.50 » par l’adresse IP de votre VM tor

2. Puis on restart le service tor :

systemctl restart tor

3. Dans notre script tor_requests.py on ajoute la fonction suivante :

def renew_ip():
    with Controller.from_port(address='172.16.13.50',port = 9051) as controller:
        controller.authenticate("iopheVoh8soh")
        controller.signal(Signal.NEWNYM)
        sleep(7)

Encore une fois remplacer « 172.16.13.50 » par l’adresse IP de votre VM tor

Dorénavant l’ip de la requête sera renouvelé toute les 5 à 9 secondes dès que vous utiliserez la fonction renew_ip() :

renew_ip()
requete1 = requests.get('https://api.ipify.org', proxies=proxies)
print(requete1.text)

On a donc des requêtes qui se lance avec des IP différentes à chaque fois, il ne nous manque plus qu’un user-agent différent à chaque requête.

Random UserAgent

Pour générer un User Agent différent à chaque fois on utilise fake_useragent :

pip install fake_useragent
from fake_useragent import UserAgent

Une fois le module importé, si avant chaque requête on régénère headers :

headers = { 'User-Agent': UserAgent().random }

L’user-agent sera différent.

Le code complet de tor_requests.py :

from time import sleep, time
import requests
# for import module vmrest
from vmrest_api import config, vm_fonctions
from fake_useragent import UserAgent
from stem import Signal
from stem.control import Controller

headers = { 'User-Agent': UserAgent().random }

def renew_ip():
    with Controller.from_port(address='172.16.13.50',port = 9051) as controller:
        controller.authenticate()
        controller.signal(Signal.NEWNYM)
        sleep(7)

vm_fonctions.power_on(config.id_tor)
renew_ip()
proxies = {
    'http': 'socks5://172.16.13.50:9050',
    'https': 'socks5://172.16.13.50:9050'
}
requete1 = requests.get('https://api.ipify.org', proxies=proxies,headers=headers)
print(requete1.text)
print(requete1.request.headers)
renew_ip()
headers = { 'User-Agent': UserAgent().random }
requete2 = requests.get('https://api.ipify.org', proxies=proxies,headers=headers)
print(requete2.text)
print(requete2.request.headers)

J’ai lancé intentionnellement 2 requêtes pour afficher les différences d’IP et d’user agent.

Selenium firefox avec le proxy tor

script tor_selenium.py

Les modules à importer :

from time import sleep, time
# for import module vmrest
from vmrest_api import config, vm_fonctions
from stem import Signal
from stem.control import Controller
from selenium import webdriver

La différence avec requests et que l’on va devoir créer une fonction profil_proxy qui sera utilisé dans notre requête selenium :

def profil_proxy():
    ip_tor = "172.16.13.50"
    port_tor = 9050
    profile = webdriver.FirefoxProfile() 
    profile.set_preference("network.proxy.type", 1)
    profile.set_preference("network.proxy.socks", ip_tor)
    profile.set_preference("network.proxy.socks_port", port_tor)
    profile.set_preference("network.proxy.socks_version", 5)
    profile.update_preferences()
    return profile

url = "https://api.ipify.org"

profile = profil_proxy()

driver = webdriver.Firefox(firefox_profile=profile)
driver.get(url)

Selenium utilisera alors votre navigateur Firefox configuré sur le proxy de votre VM Tor.

Code complet du script tor_selenium.py :

from time import sleep, time
# for import module vmrest
from vmrest_api import config, vm_fonctions
from stem import Signal
from stem.control import Controller
from selenium import webdriver


def renew_ip():
    with Controller.from_port(address='172.16.13.50',port = 9051) as controller:
        controller.authenticate("iopheVoh8soh")
        controller.signal(Signal.NEWNYM)

def profil_proxy():
    ip_tor = "172.16.13.50"
    port_tor = 9050
    profile = webdriver.FirefoxProfile() 
    profile.set_preference("network.proxy.type", 1)
    profile.set_preference("network.proxy.socks", ip_tor)
    profile.set_preference("network.proxy.socks_port", port_tor)
    profile.set_preference("network.proxy.socks_version", 5)
    profile.update_preferences()
    return profile


vm_fonctions.power_on(config.id_tor)

url = "https://api.ipify.org"

profile = profil_proxy()
driver = webdriver.Firefox(firefox_profile=profile)
driver.get(url)
sleep(3)
driver.close()
renew_ip()
driver = webdriver.Firefox(firefox_profile=profile)
driver.get(url)
sleep(3)
driver.close()

Comme pour le script précédent, ce script démarre la VM tor, set les requêtes sur le proxy tor et renouvelle l’adresse IP avant chaque requête.

Aller plus loin

Maintenant que vous savez faire des requêtes en utilisant le réseau tor et en utilisant un faux user-agent, vous êtes en mesure de scraper le web de manière anonyme.

Si vous souhaitez en savoir plus sur les manière de scraper le web, vous pouvez suivre ce tuto : WEBSCRAPING

Laisser un commentaire