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.
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.
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:
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.
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.
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.
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") # 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()
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.
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.
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)
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.
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.
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.
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)
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.
Strony internetowe mogą modyfikować swój kod, co może opóźnić ich skrobanie. Jako kontrargument można rozważyć następujące kwestie:
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.
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