Craigslist, mevcut dijital sahnede belirli sınıflandırılmış ilanlara erişmek için hala önemli bir platformdur. İlanlardan ayrıntıların çıkarılmasını kolaylaştırmak için Python kullanmak çok yararlı olmaktadır. Verimli web kazıma işlemleri, Python'daki Requests veya BeautifulSoup gibi uyarlanabilirlik ve güçlü kütüphaneler tarafından etkinleştirilir. Bu kılavuz, Python ile Craigslist kazıma alanına girerek, içerik çıkarma için BeautifulSoup ve Requests kullanımının yanı sıra anti-bot savunmalarında etkili bir şekilde gezinmek için proxy rotasyonunu vurgulamaktadır.
Daha sonra, HTTP istekleri göndermek ve belirli sayfa öğelerini ayıklamakla başlayıp verileri gerekli biçimde kaydetmekle bitirerek kazıma sürecini adım adım inceleyeceğiz.
Gerekli kütüphaneleri yüklemeniz gerekecektir:
pip install beautifulsoup4
pip install requests
Craigslist listeleme sayfalarına HTTP GET istekleri göndermek için requests kütüphanesini kullanın.
import requests
# Kazınacak Craigslist URL'lerinin listesi
urls = [
"link",
"link"
]
for url in urls:
# URL'ye bir GET isteği gönderin
response = requests.get(url)
# İsteğin başarılı olup olmadığını kontrol edin (durum kodu 200)
if response.status_code == 200:
# Yanıttan HTML içeriğini ayıklayın
html_content = response.text
else:
# İstek başarısız olursa, durum kodunu içeren bir hata mesajı yazdırın
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
HTML ayrıştırma ve alınan içerikte gezinme için BeautifulSoup kullanın.
from bs4 import BeautifulSoup
# Listedeki her URL'yi yinele
for url in urls:
# URL'ye bir GET isteği gönderin
response = requests.get(url)
# İsteğin başarılı olup olmadığını kontrol edin (durum kodu 200)
if response.status_code == 200:
# Yanıttan HTML içeriğini ayıklayın
html_content = response.text
# BeautifulSoup kullanarak HTML içeriğini ayrıştırma
soup = BeautifulSoup(html_content, 'html.parser')
else:
# İstek başarısız olursa, durum kodunu içeren bir hata mesajı yazdırın
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
BeautifulSoup yöntemlerini kullanarak Craigslist listelerinden ürün başlıkları ve fiyatları gibi verileri ayıklayın.
from bs4 import BeautifulSoup
# Listedeki her URL'yi yinele
for url in urls:
# URL'ye bir GET isteği gönderin
response = requests.get(url)
# İsteğin başarılı olup olmadığını kontrol edin (durum kodu 200)
if response.status_code == 200:
# Yanıttan HTML içeriğini ayıklayın
html_content = response.text
# BeautifulSoup kullanarak HTML içeriğini ayrıştırma
soup = BeautifulSoup(html_content, 'html.parser')
# Belirli veri noktalarını ayıklama
# Listenin başlığını bulun
title = soup.find('span', id='titletextonly').text.strip()
# Listelemenin fiyatını bulun
price = soup.find('span', class_='price').text.strip()
# İlanın açıklamasını bulun (birden fazla paragraf içerebilir)
description = soup.find('section', id='postingbody').find_all(text=True, recursive=False)
# Çıkarılan verileri yazdırma (gösterim amaçlı)
print(f"Title: {title}")
print(f"Price: {price}")
print(f"Description: {description}")
else:
# İstek başarısız olursa, durum kodunu içeren bir hata mesajı yazdırın
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
Başlık:
Fiyat:
Description:
Veriler çıkarıldıktan sonra, daha fazla analiz veya diğer araçlarla entegrasyon için bir CSV dosyasına kaydedin.
import csv
# CSV dosya yolunu ve alan adlarını tanımlayın
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']
# CSV dosyasına veri yazma
try:
# CSV dosyasını UTF-8 kodlaması ile yazma modunda açın
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
# Belirtilen alan adlarıyla bir CSV DictWriter nesnesi oluşturun
writer = csv.DictWriter(file, fieldnames=fieldnames)
# CSV dosyasına başlık satırını yazın
writer.writeheader()
# Kazınmış_veri listesindeki her öğeyi yinele
for item in scraped_data:
# Her bir öğeyi CSV dosyasına bir satır olarak yazın
writer.writerow(item)
# CSV dosyasına veri yazdıktan sonra bir başarı mesajı yazdırma
print(f"Data saved to {csv_file}")
except IOError:
# CSV dosyasına yazarken bir IOError oluşursa bir hata mesajı yazdırın
print(f"Error occurred while writing data to {csv_file}")
Craigslist, kazımayı önlemek için IP engelleme veya CAPTCHA zorlukları gibi önlemler uygulayabilir. Bu sorunları azaltmak için proxy kullanmayı ve kullanıcı aracılarını döndürmeyi düşünün.
Proxy kullanmak:
Bu örnek, IP adresi yetkilendirmesi ile bir proxy kullanımını göstermektedir.
proxies = {
'http': 'http://your_proxy_ip:your_proxy_port',
'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)
Kullanıcı-Agent rotasyonu:
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',
# Gerektiğinde daha fazla kullanıcı aracısı ekleyin
]
headers = {
'User-Agent': random.choice(user_agents)
}
response = requests.get(url, headers=headers)
Bu eksiksiz Python betiği, birden çok URL'den veri ayıklayan, ayrıştıran ve alan verimli bir Craigslist kazıyıcı oluşturmak için farklı bileşenlerin nasıl entegre edileceğini gösterir.
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()
# Kazınacak Craigslist URL'lerinin listesi
urls = [
"link",
"link"
]
# Kullanıcı aracıları ve proxy'ler
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'},
]
# Kazınmış verileri depolamak için liste
scraped_data = []
# Listedeki her URL arasında döngü
for url in urls:
# Tespit edilmekten kaçınmak için her istek için kullanıcı aracısını döndürün
headers = {
'User-Agent': random.choice(user_agents)
}
# IP engellemesini önlemek için her istek için farklı bir proxy kullanın
proxy = random.choice(proxies)
try:
# Craigslist URL'sine üstbilgiler ve proxy ile GET isteği gönderme
response = requests.get(url, headers=headers, proxies=proxy, timeout=30, verify=False)
# İsteğin başarılı olup olmadığını kontrol edin (durum kodu 200)
if response.status_code == 200:
# Yanıtın HTML içeriğini ayrıştırın
html_content = response.text
soup = BeautifulSoup(html_content, 'html.parser')
# Ayrıştırılmış HTML'den veri ayıklama
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
# Kazınan verileri listeye sözlük olarak ekleme
scraped_data.append({'Title': title, 'Price': price, 'Description': description})
print(f"Data scraped for {url}")
else:
# İstek başarısız olursa hata mesajı yazdır
print(f"Failed to retrieve {url}. Status code: {response.status_code}")
except Exception as e:
# Kazıma sırasında bir hata oluşursa istisna mesajı yazdır
print(f"Exception occurred while scraping {url}: {str(e)}")
# Kazınan verileri depolamak için CSV dosyası kurulumu
csv_file = 'craigslist_data.csv'
fieldnames = ['Title', 'Price', 'Description']
# Kazınan verileri CSV dosyasına yazma
try:
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
# CSV dosyasına başlık satırı yazma
writer.writeheader()
# Scraped_data listesini yineleyin ve her bir öğeyi CSV dosyasına yazın
for item in scraped_data:
writer.writerow(item)
# Veriler başarıyla kaydedilirse başarı mesajı yazdır
print(f"Data saved to {csv_file}")
except IOError:
# CSV dosyasına yazarken bir IOError varsa hata mesajı yazdırın
print(f"Error occurred while writing data to {csv_file}")
Craigslist önemlidir çünkü piyasaları incelemek, diğerlerinin yanı sıra potansiyel müşteriler bulmak için bize yararlı bilgiler veren seri ilanları bulabileceğimiz bir yer sağlar. Craigslist web kazıma işlemi Python tarafından BeautifulSoup ve Request gibi kütüphaneler kullanılarak kolaylaştırılmıştır. Bu eğitimde tartışılan temel taktikler, dinamik içeriği ele almak ve proxy'leri döndürmektir. Python'dan sorumlu bir şekilde yararlanarak, Craigslist listelerinden eyleme geçirilebilir bilgiler çıkarabilir ve çeşitli alanlarda bilinçli karar vermeyi destekleyebilirsiniz.
Yorumlar: 0