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.
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.
scrapy-fake-useragent
middleware:Utilisez un User-Agent aléatoire fourni par fake-useragent à chaque demande
adresses IP tournantes :
vous pouvez également l'exécuter via un proxy local et TOR :
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)
J'ai eu ce problème également. J'ai utilisé urllib
avec tor
dans python3
.
terminal ouvert et tapez:
curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
si vous voyez le résultat, cela a fonctionné.
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.