Récupérer les données d'un site web va bien au-delà de la simple collecte de son contenu; il y a beaucoup de choses à faire. Afin de contourner les limites, les lacunes et autres blocages sophistiqués, une multitude de méthodes supplémentaires doivent être utilisées, telles que le scraping de données Python.
Dans cet article, nous allons définir ce qu'est le scraping en Python, et justifier pourquoi c'est l'outil optimal pour cette tâche. Nous décrirons également les tactiques qui utilisent les capacités de scraping de données de Python. Tout cela permettra de récupérer des informations, même sur les sites les plus sécurisés.
Cet outil est spécialement conçu pour servir d'excellente ressource pour la collecte de données sur les sites web. Outre leur facilité d'utilisation, les bibliothèques Python telles que Scrapy, Selenium et BeautifulSoup sont remarquablement puissantes. En outre, il existe une nouvelle communauté active qui continue à développer des scripts et à fournir une assistance aux nouveaux utilisateurs. C'est pourquoi Python est aujourd'hui utilisé pour le web scraping. Mettons donc en évidence les principales stratégies disponibles à l'heure actuelle.
Ce bloc montrera à l'utilisateur comment récupérer des sites web complexes en utilisant des techniques plus sophistiquées intégrées à Python. L'utilisateur apprendra à:
Ces approches contribueraient à rendre efficace le scraping de données Python tout en minimisant les risques de blocage ou de refus d'accès au serveur.
Passons maintenant aux tactiques pour faire du scraping en Python de manière efficace.
Une pléthore de sites web mettent en œuvre des systèmes de sécurité CAPTCHA comme une ligne de défense solide pour protéger leurs informations contre le raclage prémédité de données à partir de Python. Ces systèmes peuvent être déjoués de plusieurs façons, en employant des services de reconnaissance automatique, comme 2Captcha ou Anti-Captcha, ou en utilisant l'apprentissage automatique pour identifier cognitivement les images. Une autre possibilité consiste à réduire le nombre de requêtes à un niveau que le tribunal n'associe pas à une attente de collecte d'informations.
Afin de rendre les requêtes moins hostiles, les utilisateurs doivent agir d'une manière plus proche du comportement normal. Introduisez des délais aléatoires entre les actions, changez d'agent utilisateur, faites défiler la page, déplacez le pointeur de la souris, simulez l'écriture, et bien d'autres choses encore. L'utilisation de Selenium ou de Playwright comme outils de scraping Python donne à l'automatisation des caractéristiques beaucoup plus humaines, ce qui permet d'éviter les blocages.
import random
import requests
url = 'https://google.com'
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'dnt': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url=url, headers=headers)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Exécution du navigateur sans interface graphique
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
# Trouver un élément par XPath
element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
# Utiliser les chaînes d'action pour déplacer le curseur
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# Fermer le navigateur
driver.quit()
Certains sites web intègrent des éléments supplémentaires conçus pour les utilisateurs normaux qui sont invisibles, mais qu'un robot peut accidentellement déclencher. Ces éléments comprennent des formulaires cachés, dont le clic et la soumission entraîneront l'interdiction d'accès au site par le robot. Avant la collecte des données, utilisez les styles et attributs CSS tels que display: none ou opacity: 0 et abstenez-vous d'utiliser ces styles.
Si les demandes sont faites sans cookies corrects ou sans configuration de session, certains sites bloqueront les demandes répétées qui sont considérées comme trop simples. Pour contourner ce problème, utilisez requests.Session(), utilisez des cookies sauvegardés et agissez comme un véritable utilisateur. Il est également nécessaire de modifier les en-têtes User-Agent, car le robot sera reconnu par ces en-têtes.
Si le serveur ne répond pas ou renvoie temporairement une erreur, faites une pause avant de répéter la commande. Il est préférable d'opter pour un délai exponentiel, qui consiste à augmenter le temps d'attente après chaque tentative infructueuse. Par exemple, on peut l'augmenter d'une seconde, de deux secondes, puis de quatre secondes, etc. Cela réduit le risque d'être bloqué tout en minimisant les limitations du site web et en réduisant la charge de travail liée à l'extraction de données avec Python.
import time
import requests
def fetch_with_backoff(url, max_retries=5):
retries = 0
wait_time = 1 # Délai de 1 seconde
while retries < max_retries:
try:
response = requests.get(url)
# Si la demande aboutit, le résultat est renvoyé
if response.status_code == 200:
return response.text
print(f"Error {response.status_code}. Retrying in {wait_time} sec.")
except requests.exceptions.RequestException as e:
print(f"Connection error: {e}. Retrying in {wait_time} sec.")
# Attendre avant de réessayer
time.sleep(wait_time)
# Augmenter le délai
wait_time *= 2
retries += 1
return None
url = "https://google.com"
html = fetch_with_backoff(url)
Certains sites web peuvent charger leur contenu par étapes, ou ne fonctionner qu'après avoir reçu des informations de l'utilisateur. Dans de tels cas, des bibliothèques telles que BeautifulSoup ne sont pas susceptibles de vous aider. Dans ce cas, le web scraping avec Selenium, Puppeteer et Playwright sera utile. Elles vous permettent d'ouvrir des pages comme le ferait un utilisateur normal, c'est-à-dire qu'il peut cliquer sur des boutons, taper du texte et interagir avec les éléments de la page.
Certaines pages web n'utilisent pas JavaScript pour afficher des données tant que l'utilisateur n'a pas accédé à la page web. Dans ce cas, une requête HTTP standard ne permet pas d'obtenir toutes les informations nécessaires. Selenium peut être utilisé pour collecter ces informations, ou les requêtes réseau peuvent être examinées à la loupe à l'aide des DevTools du navigateur. Cela permet de détecter les points d'extrémité d'API dissimulés, qui peuvent ensuite être utilisés pour la recherche d'informations avec un minimum de difficultés.
L'écrasante majorité des sites web transmettent les demandes automatisées au serveur pour traitement ultérieur. Il est bien connu que certains sites web vérifient les empreintes TLS afin de distinguer les demandes automatisées. Cela signifie que le serveur étudie divers attributs de connexion tels que l'attention portée à TLS/SSL en utilisant la technologie, les algorithmes de chiffrement et d'autres connexions sophistiquées. Il est possible d'y parvenir en mélangeant les attributs de connexion dans les requêtes à l'aide d'en-têtes et de proxys personnalisés.
import requests
url = 'username:password@your-proxy'
proxy = 'your-proxy'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
response = requests.get(url=url, proxies=proxies)
Si un site web propose une API publique, il est conseillé de l'utiliser plutôt que de recourir au scraping. Cette approche est plus rapide, plus fiable et moins susceptible d'être bloquée. Un bon point de départ pour trouver un point d'extrémité d'API est de vérifier les requêtes que le site web effectue, ce qui est visible dans DevTools. En l'absence d'API, vous devrez travailler avec le code HTML.
Les sites web peuvent modifier leur code, ce qui peut retarder le scraping. En guise de parade, considérez ce qui suit:
Dans certains cas, le web scraping avec Python à partir de sites web peut enfreindre leurs conditions d'utilisation ou même être considéré comme illégal dans certaines juridictions. Il est impératif d'examiner à la fois le fichier robots.txt et les conditions d'utilisation ainsi que la politique du site avant de récupérer des données. Il est également préférable d'utiliser une API publique si elle est disponible. En outre, fixez des limites au nombre de requêtes afin de minimiser la charge sur le serveur.
Le web scraping avancé avec Python a ses propres avantages, mais il est tout aussi important de le faire de la bonne manière. Nous avons abordé les aspects importants d'un tel processus: contourner les CAPTCHA, simuler les actions des utilisateurs, gérer les cookies et les sessions, traiter les pots de miel et examiner les données dans les applications web asynchrones.
En outre, gardez à l'esprit l'aspect moral et l'accord pertinent du site utilisé. Utilisez les points de terminaison API lorsqu'ils sont disponibles et, si l'analyse HTML est inévitable, suivez toutes les lignes directrices afin de réduire les risques de blocage et de complications juridiques.
Avec l'utilisation de ce tutoriel sur les méthodes de web scraping avec Python, le potentiel de risque peut être grandement réduit, tandis que l'efficacité peut être augmentée au maximum.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commentaires: 0