web-dev-qa-db-fra.com

Scraping in Python - Empêcher l'interdiction IP

J'utilise Python pour gratter des pages. Jusqu'à présent, je n'avais pas de problèmes compliqués.

Le site que j'essaie de gratter utilise de nombreux contrôles de sécurité et dispose d'un mécanisme pour empêcher le raclage.

En utilisant Requests et lxml j'ai pu gratter environ 100 à 150 pages avant d'être banni par IP. Parfois, j'obtiens même une interdiction à la première demande (nouvelle IP, non utilisée auparavant, bloc C différent). J'ai essayé avec des en-têtes d'usurpation, randomiser le temps entre les demandes, toujours le même.

J'ai essayé avec Selenium et j'ai obtenu de bien meilleurs résultats. Avec le sélénium, j'ai pu gratter environ 600 à 650 pages avant d'être banni. Ici, j'ai également essayé de randomiser les requêtes (entre 3 à 5 secondes et de faire appel à time.sleep(300) à chaque 300ème requête). Malgré cela, je suis banni.

De là, je peux conclure que le site a un mécanisme où il interdit IP s'il demande plus de X pages dans une session de navigateur ouverte ou quelque chose comme ça.

D'après votre expérience, que dois-je essayer d'autre? La fermeture et l'ouverture du navigateur dans Selenium aideront-elles (par exemple, après chaque 100e demande, le navigateur se ferme et s'ouvre). Je pensais essayer avec des procurations mais il y a environ un million de pages et ce sera très étendu.

13
RhymeGuy

Si vous passiez au framework Scrapy web-scraping , vous seriez en mesure de réutiliser un certain nombre de choses qui ont été faites pour empêcher et lutter contre l'interdiction:

Il s'agit d'une extension pour la limitation automatique de la vitesse d'exploration en fonction de la charge du serveur Scrapy et du site Web que vous explorez.

Utilisez un User-Agent aléatoire fourni par fake-useragent à chaque demande

14
alecxe

Vous pouvez utiliser des procurations.

Vous pouvez acheter plusieurs centaines d'adresses IP à très bon marché et utiliser le sélénium comme vous l'avez fait précédemment. De plus, je suggère de varier le navigateur que vous utilisez et d'autres paramètres de l'agent utilisateur.

Vous pouvez répéter l'utilisation d'une seule adresse IP pour charger uniquement x nombre de pages et vous arrêter avant d'être banni.

def load_proxy(PROXY_Host,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_Host)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("general.useragent.override","whater_useragent")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)
5
par

J'ai eu ce problème également. J'ai utilisé urllib avec tor dans python3.

  1. télécharger et installer le navigateur tor
  2. test tor

terminal ouvert et tapez:

curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>

si vous voyez le résultat, cela a fonctionné.

  1. Maintenant, nous devons tester en python. Maintenant, exécutez ce code
import socks
import socket
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

#set socks5 proxy to use tor

socks.set_default_proxy(socks.SOCKS5, "localhost", 9050)
socket.socket = socks.socksocket
req = Request('http://check.torproject.org', headers={'User-Agent': 'Mozilla/5.0', })
html = urlopen(req).read()
soup = BeautifulSoup(html, 'html.parser')
print(soup('title')[0].get_text())

si tu vois

Toutes nos félicitations. Ce navigateur est configuré pour utiliser Tor.

cela a fonctionné en python aussi et cela signifie que vous utilisez tor pour le Web scraping.

3
Mohammad Reza