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.
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.
Konieczne będzie zainstalowanie niezbędnych bibliotek:
pip install beautifulsoup4
pip install requests
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}")
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, 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ł:
Cena:
Opis:
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}")
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)
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