Przewodnik po skrobaniu Craigslist za pomocą Pythona

Komentarze: 0

Craigslist jest nadal znaczącą platformą dostępu do konkretnych ogłoszeń drobnych na obecnej scenie cyfrowej. Korzystanie z Pythona w usprawnianiu ekstrakcji szczegółów z ogłoszeń okazuje się bardzo pomocne. Wydajne operacje skrobania stron internetowych są możliwe dzięki możliwościom adaptacji i silnym bibliotekom w Pythonie, takim jak Requests lub BeautifulSoup. Ten przewodnik zagłębia się w sferę skrobania Craigslist za pomocą Pythona, podkreślając wykorzystanie BeautifulSoup i Requests do ekstrakcji treści, wraz z rotacją proxy w celu skutecznego poruszania się po zabezpieczeniach przed botami.

Podstawowe kroki do skrobania Craigslist za pomocą Pythona

Następnie przejdziemy przez proces skrobania krok po kroku, zaczynając od wysyłania żądań HTTP i wyodrębniania określonych elementów strony, a kończąc na zapisywaniu danych w wymaganym formacie.

Konfiguracja środowiska

Konieczne będzie zainstalowanie niezbędnych bibliotek:


pip install beautifulsoup4
pip install requests

Wysyłanie żądań HTTP do stron Craigslist

Biblioteka requests służy do wysyłania żądań HTTP GET do stron z listami Craigslist.


import requests

# Lista adresów URL Craigslist do zeskrobania
urls = [
    "link",
    "link"
]

for url in urls:
    # Wyślij żądanie GET do adresu URL
    response = requests.get(url)
    
    # Sprawdź, czy żądanie powiodło się (kod statusu 200).
    if response.status_code == 200:
        # Wyodrębnij zawartość HTML z odpowiedzi
        html_content = response.text
        
    else:
        # Jeśli żądanie nie powiodło się, wydrukowany zostanie komunikat o błędzie z kodem statusu
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Parsowanie zawartości HTML za pomocą BeautifulSoup

Użyj BeautifulSoup do parsowania HTML i nawigacji po pobranej zawartości.


from bs4 import BeautifulSoup

# Iteracja przez każdy adres URL na liście
for url in urls:
    # Wyślij żądanie GET do adresu URL
    response = requests.get(url)
    
    # Sprawdź, czy żądanie powiodło się (kod statusu 200).
    if response.status_code == 200:
        # Wyodrębnij zawartość HTML z odpowiedzi
        html_content = response.text
        
        # Parsowanie zawartości HTML przy użyciu BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
    else:
        # Jeśli żądanie nie powiodło się, wydrukowany zostanie komunikat o błędzie z kodem statusu
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Wyodrębnianie danych przy użyciu metod BeautifulSoup

Wyodrębnianie danych, takich jak tytuły i ceny przedmiotów z ofert Craigslist przy użyciu metod BeautifulSoup.


from bs4 import BeautifulSoup

# Iteracja przez każdy adres URL na liście
for url in urls:
    # Wyślij żądanie GET do adresu URL
    response = requests.get(url)
    
    # Sprawdź, czy żądanie powiodło się (kod statusu 200).
    if response.status_code == 200:
        # Wyodrębnij zawartość HTML z odpowiedzi
        html_content = response.text
        
        # Parsowanie zawartości HTML przy użyciu BeautifulSoup
        soup = BeautifulSoup(html_content, 'html.parser')
        
        # Wyodrębnianie określonych punktów danych
        # Znajdź tytuł oferty
        title = soup.find('span', id='titletextonly').text.strip()
        
        # Znajdź cenę oferty
        price = soup.find('span', class_='price').text.strip()
        
        # Znajdź opis oferty (może zawierać wiele akapitów)
        description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
        
        # Wydruk wyodrębnionych danych (do celów demonstracyjnych)
        print(f"Title: {title}")
        print(f"Price: {price}")
        print(f"Description: {description}")
        
    else:
        # Jeśli żądanie nie powiedzie się, wydrukowany zostanie komunikat o błędzie z kodem statusu
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Tytuł:

1.png

Cena:

2.png

Opis:

3.png

Zapisywanie zeskrobanych danych do pliku CSV

Po wyodrębnieniu danych, zapisz je do pliku CSV w celu dalszej analizy lub integracji z innymi narzędziami.


import csv

# Zdefiniuj ścieżkę do pliku CSV i nazwy pól
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Zapisywanie danych do pliku CSV
try:
    # Otwórz plik CSV w trybie zapisu z kodowaniem UTF-8
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        # Utworzenie obiektu CSV DictWriter z określonymi nazwami pól
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        
        # Zapisz wiersz nagłówka w pliku CSV
        writer.writeheader()
        
        # Iteracja przez każdy element na liście scraped_data
        for item in scraped_data:
            # Zapisz każdą pozycję jako wiersz w pliku CSV
            writer.writerow(item)
        
    # Wydruk komunikatu o powodzeniu po zapisaniu danych do pliku CSV
    print(f"Data saved to {csv_file}")

except IOError:
    # Wyświetla komunikat o błędzie, jeśli podczas zapisu do pliku CSV wystąpi błąd IOError.
    print(f"Error occurred while writing data to {csv_file}")

Radzenie sobie z potencjalnymi przeszkodami

Craigslist może wdrożyć środki zapobiegające skrobaniu, takie jak blokowanie adresów IP lub wyzwania CAPTCHA. Aby złagodzić te problemy, należy rozważyć użycie serwerów proxy i rotacyjnych agentów użytkownika.

Korzystanie z serwerów proxy:

Ten przykład demonstruje użycie serwera proxy z autoryzacją adresu IP.


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}

response = requests.get(url, proxies=proxies)

Obrót User-Agent:


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # W razie potrzeby dodaj więcej agentów użytkownika
]

headers = {
    'User-Agent': random.choice(user_agents)
}

response = requests.get(url, headers=headers)

Pełny kod

Ten kompletny skrypt Pythona pokazuje, jak zintegrować różne komponenty, aby zbudować wydajny skrobak Craigslist, który wyodrębnia, analizuje i pobiera dane z wielu adresów URL.


import requests
import urllib3
from bs4 import BeautifulSoup
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# Lista adresów URL Craigslist do zeskrobania
urls = [
    "link",
    "link"
]

# Agenci użytkownika i serwery proxy
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
]

proxies = [
    {'http': 'http://your_proxy_ip1:your_proxy_port1', 'https': 'https://your_proxy_ip1:your_proxy_port1'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
]

# Lista do przechowywania zeskrobanych danych
scraped_data = []

# Pętla przez każdy adres URL na liście
for url in urls:
    # Zmiana agenta użytkownika dla każdego żądania w celu uniknięcia wykrycia
    headers = {
        'User-Agent': random.choice(user_agents)
    }

    # Użyj innego serwera proxy dla każdego żądania, aby uniknąć blokowania adresów IP.
    proxy = random.choice(proxies)

    try:
        # Wyślij żądanie GET do adresu URL Craigslist z nagłówkami i proxy
        response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
        
        # Sprawdź, czy żądanie powiodło się (kod statusu 200).
        if response.status_code == 200:
            # Parsowanie zawartości HTML odpowiedzi
            html_content = response.text
            soup = BeautifulSoup(html_content, 'html.parser')

            # Wyodrębnianie danych z przeanalizowanego kodu HTML
            title = soup.find('span', id='titletextonly').text.strip()
            price = soup.find('span', class_='price').text.strip()
            description = soup.find('section', id='postingbody').get_text(strip=True, separator='\n')  # Extracting description

            # Dołącz do listy zeskrobane dane jako słownik
            scraped_data.append({'Title': title, 'Price': price, 'Description': description})
            print(f"Data scraped for {url}")
        else:
            # Wydruk komunikatu o błędzie w przypadku niepowodzenia żądania
            print(f"Failed to retrieve {url}. Status code: {response.status_code}")
    except Exception as e:
        # Drukowanie komunikatu wyjątku w przypadku wystąpienia błędu podczas skrobania
        print(f"Exception occurred while scraping {url}: {str(e)}")

# Konfiguracja pliku CSV do przechowywania zeskrobanych danych
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']

# Zapisywanie zeskrobanych danych do pliku CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)

        # Zapisanie wiersza nagłówka w pliku CSV
        writer.writeheader()

        # Iteracja przez listę scraped_data i zapisanie każdego elementu do pliku CSV
        for item in scraped_data:
            writer.writerow(item)

    # Print success message if data is saved successfully
    print(f"Data saved to {csv_file}")
except IOError:
    # Wyświetla komunikat o błędzie w przypadku wystąpienia błędu IOError podczas zapisu do pliku CSV.
    print(f"Error occurred while writing data to {csv_file}")

Craigslist jest ważny, ponieważ zapewnia miejsce, w którym możemy znaleźć ogłoszenia, które dostarczają nam przydatnych informacji do badania rynków, znajdowania potencjalnych klientów i innych. Craigslist web scraping jest łatwy w Pythonie przy użyciu bibliotek takich jak BeautifulSoup i Request. Kluczowe taktyki omówione w tym samouczku to obsługa dynamicznej zawartości i obracanie serwerów proxy. Wykorzystując Pythona w odpowiedzialny sposób, można wydobyć przydatne informacje z ofert Craigslist, wspierając świadome podejmowanie decyzji w różnych domenach.

Komentarze:

0 komentarze