Zaawansowane taktyki skrobania stron internetowych w Pythonie

Komentarze: 0

Zbieranie danych z witryny internetowej to znacznie więcej niż tylko zbieranie jej zawartości; składa się na to wiele elementów. Aby ominąć limity, luki i inne wyrafinowane blokady, należy użyć wielu dodatkowych metod, takich jak skrobanie danych w Pythonie.

W tym artykule zdefiniujemy, czym jest skrobanie danych w Pythonie i uzasadnimy, dlaczego jest to optymalne narzędzie do tego zadania. A także nakreślimy taktyki, które wykorzystują możliwości skrobania danych w Pythonie. Wszystko to pomoże w pozyskiwaniu informacji nawet z najbardziej bezpiecznych witryn.

Dlaczego Python jest idealny do skrobania stron internetowych?

To narzędzie zostało specjalnie zaprojektowane, aby służyć jako doskonałe źródło do zbierania danych ze stron internetowych. Oprócz użyteczności, biblioteki Pythona, takie jak Scrapy, Selenium i BeautifulSoup są niezwykle potężne. Poza tym istnieje aktywna społeczność, która stale rozwija skrypty i zapewnia wsparcie nowym użytkownikom. Właśnie dlatego Python jest obecnie używany do skrobania stron internetowych. Podkreślmy więc główne strategie dostępne w tej chwili.

Taktyki skrobania w Pythonie

Ten blok pokaże użytkownikowi, jak skrobać złożone strony internetowe przy użyciu bardziej zaawansowanych technik wbudowanych w Pythona. Użytkownik nauczy się jak:

  • Unikaj blokowania przez ochronę przed botami - obsługuj CAPTCHA, honeypoty i TLS fingerprinting.
  • Działaj jako rzeczywisty użytkownik, aby uniknąć zablokowania.
  • Kontroluj pliki cookie i sesje, aby zachować uwierzytelnienie podczas uzyskiwania dostępu do stron o ograniczonym dostępie.
  • Zarządzaj danymi uzyskanymi z interfejsów API i obsługuj dane ładowane asynchronicznie.
  • Zabezpiecz skrypt przed modyfikacjami na stronie i dopracuj logikę dla zasobów dynamicznych.

Podejścia te pomogłyby w skutecznym skrobaniu danych w Pythonie, jednocześnie minimalizując ryzyko zablokowania lub odmowy dostępu do serwera.

Przejdźmy teraz do taktyki, jak skutecznie wykonywać scraping w Pythonie.

Taktyka 1: Obsługa CAPTCHA i środków ochrony przed botami

Mnóstwo stron internetowych wdraża systemy bezpieczeństwa CAPTCHA jako solidną linię obrony, aby chronić swoje informacje przed celowym pobieraniem danych z Pythona. Takie systemy można pokonać na wiele sposobów, wykorzystując usługi automatycznego rozpoznawania, takie jak 2Captcha lub Anti-Captcha, lub wykorzystując uczenie maszynowe do poznawczej identyfikacji obrazów. Inną możliwością jest zmniejszenie ilości zapytań do poziomu, który nie będzie kojarzony przez sąd z oczekiwaniem gromadzenia informacji.

Taktyka 2: Naśladowanie ludzkich zachowań

Aby uczynić zapytania mniej wrogimi, użytkownicy muszą działać w sposób bliższy normalnemu zachowaniu. Należy wprowadzić losowe czasy między działaniami, przełączać User-Agent, przewijać stronę, poruszać wskaźnikiem myszy, symulować pisanie i wiele więcej. Korzystanie z Selenium lub Playwright jako narzędzi do skrobania w Pythonie daje automatyzacji znacznie bardziej ludzkie cechy, dzięki czemu można uniknąć blokad.

  • Zmiana User-Agent:
    
    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)
    
    
    
  • Ruch kursora:
    
    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")  # Uruchamianie przeglądarki bez interfejsu graficznego
    driver = webdriver.Chrome(options=options)
    
    driver.get("https://google.com")
    
    # Znajdź element za pomocą XPath
    element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
    
    # Użyj ActionChains, aby przesunąć kursor
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    
    # Zamknij przeglądarkę
    driver.quit()
    
    
    

Taktyka 3: Unikanie pułapek Honeypot

Niektóre strony internetowe zawierają dodatkowe elementy przeznaczone dla zwykłych użytkowników, które są niewidoczne, ale bot może je przypadkowo uruchomić. Elementy te obejmują ukryte formularze, których kliknięcie i przesłanie spowoduje zablokowanie dostępu bota do witryny. Przed zebraniem danych należy użyć stylów i atrybutów CSS, takich jak display: none lub opacity: 0 i powstrzymać się od ich stosowania.

Taktyka 4: Zarządzanie plikami cookie i sesjami

Jeśli żądania są wykonywane bez prawidłowych plików cookie lub konfiguracji sesji, niektóre witryny będą blokować powtarzające się żądania, które są uważane za zbyt proste. Aby obejść ten problem, użyj requests.Session(), wykorzystaj zapisane pliki cookie i działaj jak prawdziwy użytkownik. Należy również zmienić nagłówki User-Agent, ponieważ bot zostanie przez nie rozpoznany.

Taktyka 5: Implementacja wykładniczego cofania dla ponawiania żądań na potrzeby skrobania danych w Pythonie

W przypadku, gdy serwer nie odpowie lub tymczasowo zwróci błąd, należy wstrzymać się przed kolejnymi próbami powtórzenia polecenia. Wykładniczy backoff jest bardziej preferowany - odnosi się do zwiększania czasu oczekiwania po każdej nieudanej próbie. Na przykład można go zwiększyć o 1 sekundę, 2 sekundy, następnie 4 sekundy itd. Zmniejsza to szansę na zablokowanie przy jednoczesnym zminimalizowaniu ograniczeń strony internetowej i zmniejszeniu obciążenia związanego ze skrobaniem danych w Pythonie.


import time
import requests


def fetch_with_backoff(url, max_retries=5):
   retries = 0
   wait_time = 1  # 1-sekundowe opóźnienie

   while retries < max_retries:
       try:
           response = requests.get(url)

           # Jeśli żądanie się powiedzie, zwrócony zostanie wynik
           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.")

       # Poczekaj przed ponowieniem próby
       time.sleep(wait_time)

       # Zwiększenie opóźnienia
       wait_time *= 2
       retries += 1

   return None


url = "https://google.com"
html = fetch_with_backoff(url)


Taktyka 6: Wykorzystanie przeglądarek bezgłowych do złożonych interakcji

Niektóre strony internetowe mogą ładować zawartość etapami lub mogą działać tylko po otrzymaniu pewnych danych wejściowych od użytkownika. W takich przypadkach biblioteki takie jak BeautifulSoup raczej nie pomogą. W takim przypadku pomocne będzie skrobanie stron internetowych za pomocą Selenium, Puppeteer i Playwright. Umożliwiają one otwieranie stron tak, jak robiłby to normalny użytkownik, co oznacza, że może on klikać przyciski, wpisywać tekst i w inny sposób angażować się w elementy na stronie.

Taktyka 7: Skrobanie danych w Pythonie z wykorzystaniem ładowania asynchronicznego

Istnieją strony internetowe, które nie będą używać JavaScript do wyświetlania danych, dopóki użytkownik nie uzyska dostępu do strony. W takim przypadku standardowe żądanie HTTP nie pobierze wszystkich niezbędnych informacji. Selenium może być używane do zbierania takich informacji lub żądania sieciowe mogą być analizowane za pomocą narzędzi DevTools przeglądarki. Pomaga to w wykrywaniu ukrytych punktów końcowych API, które można później wykorzystać do wyszukiwania informacji przy minimalnym wysiłku.

Taktyka 8: Wykrywanie i unikanie TLS Fingerprinting

Zdecydowana większość stron internetowych przekazuje automatyczne żądania do serwera w celu dalszego przetwarzania. Powszechnie wiadomo, że niektóre witryny weryfikują odciski palców TLS jako sposób na rozróżnienie automatycznych żądań. Oznacza to, że serwer bada różne atrybuty połączenia, takie jak uwaga TLS/SSL przy użyciu technologii, szyfrów i innych wyrafinowanych połączeń. Można to osiągnąć poprzez mieszanie atrybutów połączenia w żądaniach przy użyciu niestandardowych nagłówków i serwerów proxy.

  • Integracja proxy:
    
    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)
    
    
    

Taktyka 9: Wykorzystywanie punktów końcowych API, gdy są dostępne

Jeśli witryna oferuje publiczny interfejs API, zaleca się korzystanie z niego zamiast uciekania się do skrobania. Takie podejście jest szybsze, bardziej niezawodne i mniej prawdopodobne, że zostanie zablokowane. Dobrym punktem wyjścia do znalezienia punktu końcowego API jest sprawdzenie żądań wykonywanych przez witrynę, co jest widoczne w DevTools. W przypadku braku API, będziesz musiał pracować z kodem HTML.

Taktyka 10: Monitorowanie zmian w strukturze strony internetowej

Strony internetowe mogą modyfikować swój kod, co może opóźnić ich skrobanie. Jako kontrargument można rozważyć następujące kwestie:

  • Przejście z selektorów CSS na XPath;
  • Używaj zautomatyzowanych testów do okresowego monitorowania struktury strony;
  • Stwórz inteligentny kod, który poradzi sobie z prawdopodobnymi zmianami. Jednym ze sposobów jest wyszukiwanie elementów według ich zawartości, a nie według z góry określonych ścieżek.

Taktyka 11: Zapewnienie zgodności z warunkami korzystania z witryny internetowej

W niektórych przypadkach skrobanie stron internetowych za pomocą Pythona może naruszać ich warunki użytkowania, a nawet być uważane za nielegalne w niektórych jurysdykcjach. Konieczne jest sprawdzenie zarówno pliku robots.txt, jak i warunków korzystania z usługi wraz z polityką witryny przed skrobaniem danych. Najlepiej jest również korzystać z publicznego API, jeśli jest ono dostępne. Ponadto należy ustawić limity liczby żądań, aby zminimalizować obciążenie serwera.

Skrobanie danych w Pythonie: Podsumowanie

Zaawansowane skrobanie stron internetowych za pomocą Pythona ma swoje zalety, ale robienie tego we właściwy sposób jest równie ważne. Omówiliśmy ważne aspekty takiego procesu dotyczące omijania CAPTCHA, symulowania działań użytkownika, zarządzania plikami cookie i sesjami, radzenia sobie z honeypotami i badania danych w asynchronicznych aplikacjach internetowych.

Ponadto należy pamiętać o aspekcie moralnym i odpowiedniej umowie używanej witryny. Korzystaj z punktów końcowych API, jeśli są dostępne, a jeśli analizowanie HTML jest nieuniknione, postępuj zgodnie ze wszystkimi wytycznymi, aby zmniejszyć ryzyko zablokowania i komplikacji prawnych.

Korzystając z tego samouczka dotyczącego metod skrobania stron internetowych w Pythonie, można znacznie zmniejszyć ryzyko, a jednocześnie maksymalnie zwiększyć skuteczność.

Komentarze:

0 komentarze