Python, sağlam kütüphaneleri ve basit sözdizimi nedeniyle web kazıma için en iyi seçenek olarak öne çıkıyor. Bu makalede, web kazımanın temellerini keşfedecek ve ilk web kazıyıcınızı oluşturmak için Python ortamınızı kurarken size rehberlik edeceğiz. Beautiful Soup, Playwright ve lxml dahil olmak üzere kazıma görevleri için uygun temel Python kütüphanelerini tanıtacağız.
Python, web kazımayı kolaylaştırmak için çeşitli kütüphaneler sağlar. İşte en yaygın kullanılanlardan bazıları:
HTTP (HyperText Transfer Protocol), web üzerinden veri aktarımı için kullanılan bir uygulama katmanı protokolüdür. Tarayıcıya bir URL yazarsınız ve tarayıcı bir HTTP isteği oluşturarak bunu web sunucusuna gönderir. Web sunucusu daha sonra HTTP yanıtını tarayıcıya geri gönderir ve bu yanıtı size HTML sayfası olarak görüntüler. Web kazıma için, bu süreci taklit etmeniz ve web sayfalarının HTTP içeriğini programlı olarak almak için komut dosyanızdan HTTP istekleri oluşturmanız gerekir.
Öncelikle, sisteminizde Python'un kurulu olduğundan emin olun. Python'un resmi web sitesinden indirebilirsiniz.
Sanal ortam, bağımlılıkların yönetilmesine yardımcı olur. Sanal bir ortam oluşturmak ve etkinleştirmek için bu komutları kullanın:
python -m venv scraping_env
source scraping_env/bin/activate
Ardından, aşağıdaki komutları kullanarak gerekli paketleri yükleyin:
pip install requests
pip install beautifulsoup4
pip install lxml
Statik HTML içeriğini kazıma isteğini kullanan basit bir web kazıyıcı ile başlayalım.
En yaygın HTTP isteği türü, belirtilen bir URL'den veri almak için kullanılan GET isteğidir. İşte http://example.com adresine GET isteğinin nasıl gerçekleştirileceğine dair temel bir örnek.
import requests
url = 'http://example.com'
response = requests.get(url)
requests kütüphanesi yanıtı ele almak ve işlemek için çeşitli yollar sağlar:
Durum kodunu kontrol edin: isteğin başarılı olduğundan emin olun.
if response.status_code == 200:
print('Request was successful!')
else:
print('Request failed with status code:', response.status_code)
İçerik çıkarma: yanıttan metin veya JSON içeriğini çıkarın.
# Yanıt içeriğini metin olarak al
page_content = response.text
print(page_content)
# Yanıt içeriğini JSON olarak al (yanıt JSON biçimindeyse)
json_content = response.json()
print(json_content)
HTTP ve ağ hataları, bir kaynağa erişilemediğinde, istek zaman aşımına uğradığında veya sunucu bir hata HTTP durumu döndürdüğünde (örn. 404 Not Found, 500 Internal Server Error) ortaya çıkabilir. Bu durumları ele almak için istekler tarafından oluşturulan istisna nesnelerini kullanabiliriz.
import requests
url = 'http://example.com'
try:
response = requests.get(url, timeout=10) # Set a timeout for the request
response.raise_for_status() # Raises an HTTPError for bad responses
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
print('Failed to connect to the server.')
except requests.exceptions.Timeout:
print('The request timed out.')
except requests.exceptions.RequestException as req_err:
print(f'Request error: {req_err}')
else:
print('Request was successful!')
Web kazıma için genellikle HTML içeriğinden veri çıkarmamız gerekir. Bu bölümde, Beautiful Soup veya lxml gibi bazı kütüphanelerle HTML öğelerinden verilerin nasıl bulunacağı ve çıkarılacağı hakkında konuşacağız.
HTML (HyperText Markup Language) web sayfaları oluşturmak için kullanılan standart biçimlendirme dilidir. Bu dil, <div>, <p>, <a> gibi etiketlerle temsil edilen iç içe geçmiş öğelerden oluşur. Her etiket özniteliklere sahip olabilir ve metin, diğer etiketler veya her ikisini de içerebilir.
XPath ve CSS seçicileri, HTML öğelerini niteliklerine veya belgedeki konumlarına göre seçmek için çok yönlü bir yol sağlar.
Web kazıma yaparken, web sayfalarından belirli verileri ayıklamak genellikle HTML öğelerini hedeflemek için doğru XPath veya CSS seçicilerini tanımlamayı gerektirir. İşte bu seçicileri verimli bir şekilde nasıl bulabileceğiniz:
Çoğu modern web tarayıcısı, web sayfalarının HTML yapısını incelemenize olanak tanıyan yerleşik geliştirici araçlarıyla birlikte gelir. İşte bu araçların nasıl kullanılacağına dair adım adım bir kılavuz:
XPath: /html/body/div/h1
CSS Selector: body > div > h1
Beautiful Soup, HTML ve XML belgelerini ayrıştırmak için kullanılan bir Python kütüphanesidir. HTML yapısı içinde gezinmek ve arama yapmak için basit yöntemler ve nitelikler sağlar.
from bs4 import BeautifulSoup
import requests
# Kazınacak web sayfasının URL'si
url = 'https://example.com'
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url)
# Beautiful Soup kullanarak yanıtın HTML içeriğini ayrıştırma
soup = BeautifulSoup(response.content, 'html.parser')
# CSS seçicisini kullanarak <div> etiketleri içinde bulunan tüm <h1> etiketlerini bulun
<body> etiketinin doğrudan çocukları olan #
h1_tags = soup.select('body > div > h1')
# Bulunan <h1> etiketlerinin listesi üzerinde yineleme yapın ve metin içeriklerini yazdırın
for tag in h1_tags:
print(tag.text)
Ayrıştırma hataları, HTML veya XML yapısı beklendiği gibi olmadığında ortaya çıkar ve veri ayıklamada sorunlara neden olur. Bunlar AttributeError gibi istisnalar işlenerek yönetilebilir.
from bs4 import BeautifulSoup
import requests
# Kazınacak web sayfasının URL'si
url = 'https://example.com'
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url)
try:
# Beautiful Soup kullanarak yanıtın HTML içeriğini ayrıştırma
soup = BeautifulSoup(response.content, 'html.parser')
# CSS seçicisini kullanarak <body> etiketinin doğrudan çocukları olan <div> etiketlerinin içinde bulunan tüm <h1> etiketlerini bulun
h1_tags = soup.select('body > div > h1')
# Bulunan <h1> etiketlerinin listesi üzerinde yineleme yapın ve metin içeriklerini yazdırın
for tag in h1_tags:
print(tag.text)
except AttributeError as attr_err:
# AttributeError oluşabilecek durumları ele alın (örneğin, response.content None ise)
print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
# Ayrıştırma sırasında oluşabilecek diğer istisnaları ele alın
print(f'Error while parsing HTML: {parse_err}')
Beautiful Soup'a ek olarak, Python'da HTML ve XML belgelerini ayrıştırmak için kullanılan bir diğer popüler kütüphane de lxml'dir. BeautifulSoup, ayrıştırılmış verilerde gezinmek ve bunları işlemek için uygun bir arayüz sağlamaya odaklanırken, lxml hızı ve esnekliği ile bilinir, bu da onu performans açısından kritik görevler için tercih edilen bir seçim haline getirir.
from lxml.html import fromstring
import requests
# Kazınacak web sayfasının URL'si
url = 'https://example.com'
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url)
# lxml'nin fromstring yöntemini kullanarak yanıtın HTML içeriğini ayrıştırın
parser = fromstring(response.text)
# XPath kullanarak, <body> etiketinin doğrudan çocuğu olan bir <div> etiketinin içinde bulunan ilk <h1> etiketinin metin içeriğini bulun
title = parser.xpath('/html/body/div/h1/text()')[0]
# Başlığı yazdır
print(title)
Beautiful Soup'a benzer şekilde lxml, lxml.etree.XMLSyntaxError gibi istisnaları yakalayarak ayrıştırma hatalarını incelikle ele almanızı sağlar.
from lxml.html import fromstring
from lxml import etree
import requests
# Kazınacak web sayfasının URL'si
url = 'https://example.com'
# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url)
try:
# lxml'nin fromstring yöntemini kullanarak yanıtın HTML içeriğini ayrıştırın
parser = fromstring(response.text)
# XPath kullanarak, <body> etiketinin doğrudan çocuğu olan bir <div> etiketinin içinde bulunan ilk <h1> etiketinin metin içeriğini bulun
title = parser.xpath('/html/body/div/h1/text()')[0]
# Başlığı yazdır
print(title)
except IndexError:
# XPath sorgusunun herhangi bir sonuç döndürmediği durumu ele alın
print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Ayrıştırma sırasında XML sözdizimi hatalarını işleme
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Handle any other exceptions
print(f'An unexpected error occurred: {e}')
HTML öğelerinden başarılı bir şekilde veri ayıkladıktan sonra, bir sonraki adım bu verileri kaydetmektir. Python, kazınmış verileri kaydetmek için CSV dosyalarına, JSON dosyalarına ve veritabanlarına kaydetme dahil olmak üzere çeşitli seçenekler sunar. İşte farklı formatlar kullanarak çıkarılan verilerin nasıl kaydedileceğine dair genel bir bakış:
CSV (Virgülle Ayrılmış Değerler), tablo verilerini depolamak için basit ve yaygın olarak kullanılan bir formattır. Python'daki CSV modülü, CSV dosyalarına veri yazmayı kolaylaştırır.
import csv
# Örnek veriler
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Verileri bir CSV dosyasına kaydetme
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Paragraph'])
for paragraph in data['paragraphs']:
writer.writerow([data['title'], paragraph])
print('Data saved to scraped_data.csv')
JSON (JavaScript Object Notation), okunması ve yazılması kolay, hafif bir veri değişim formatıdır. Python'daki JSON modülü, verileri JSON biçiminde kaydetmek için yöntemler sağlar.
import json
# Örnek veriler
data = {
'title': 'Example Title',
'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}
# Verileri bir JSON dosyasına kaydetme
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
print('Data saved to scraped_data.json')
Playwright, dinamik içeriği kazımak ve web öğeleriyle etkileşim kurmak için güçlü bir araçtır. Statik HTML ayrıştırıcılarının yapamadığı JavaScript ağırlıklı web sitelerini işleyebilir.
Playwright'ı yükleyin ve kurun:
pip install playwright
playwright install
Playwright, form doldurma ve düğmelere tıklama gibi web öğeleriyle etkileşime girmenizi sağlar. Devam etmeden önce AJAX isteklerinin tamamlanmasını bekleyebilir, bu da onu dinamik içeriği kazımak için ideal hale getirir.
Sağlanan kod, Playwright ve lxml kullanarak bir Amazon ürün sayfasında web kazıma işlemi gerçekleştirir. Başlangıçta gerekli modüller içe aktarılır. Kazıma mantığını kapsüllemek için bir çalıştırma işlevi tanımlanır. İşlev, bir proxy sunucusu kurarak ve proxy ile ve başlıksız modda yeni bir tarayıcı örneği başlatarak başlar, böylece tarayıcı eylemlerini gözlemlememize olanak tanır. Tarayıcı bağlamında yeni bir sayfa açılır ve sayfanın tamamen yüklenmesini sağlamak için 60 saniyelik bir zaman aşımı ile belirtilen Amazon ürün URL'sine gidilir.
Kod daha sonra bir açılır menüden belirli bir ürün stilini ve konum belirleyiciler ve metin eşleştirme kullanarak bir ürün seçeneğini seçmek için sayfayla etkileşime girer. Bu etkileşimlerin tamamlandığından ve sayfanın yeniden tam olarak yüklendiğinden emin olduktan sonra, sayfanın HTML içeriği yakalanır.
HTML içeriği daha sonra bir öğe ağacı oluşturmak için lxml'nin fromstring yöntemi kullanılarak ayrıştırılır. Ürün başlığının metin içeriğini productTitle kimliğine sahip belirli bir öğeden çıkarmak için bir XPath sorgusu kullanılır. Kod, XPath sorgusunun sonuç döndürmediği, ayrıştırma sırasında XML sözdizimi hatalarının olduğu veya diğer beklenmedik istisnaların olduğu durumları yönetmek için hata işleme içerir. Son olarak, tlxml'den çıkarılan ürün başlığı yazdırılır ve oturumu sonlandırmak için tarayıcı bağlamı ve tarayıcı kapatılır.
Çalıştırma işlevi, sync_playwright tarafından başlatılan bir Playwright oturumu içinde yürütülür ve tüm sürecin kontrollü bir ortamda yönetilmesini ve yürütülmesini sağlar. Bu yapı, web kazıma görevini gerçekleştirirken sağlamlık ve hata esnekliği sağlar.
from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree
def run(playwright: Playwright) -> None:
# Proxy sunucusunu tanımlama
proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}
# Belirtilen proxy ile ve başlıksız modda yeni bir tarayıcı örneği başlatma
browser = playwright.chromium.launch(
headless=False,
proxy=proxy,
slow_mo=50,
args=['--ignore-certificate-errors'],
)
# Yeni bir tarayıcı bağlamı oluşturma
context = browser.new_context(ignore_https_errors=True)
# Tarayıcı bağlamında yeni bir sayfa açma
page = context.new_page()
# Belirtilen Amazon ürün sayfasına gitme
page.goto(
"https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
timeout=10000,
)
# Sayfanın tamamen yüklenmesini bekleyin
page.wait_for_load_state("load")
# Açılır menüden belirli bir ürün stili seçin
page.locator("#dropdown_selected_style_name").click()
# Belirli bir ürün seçeneği seçin
page.click('//*[@id="native_dropdown_selected_style_name_1"]')
page.wait_for_load_state("load")
# Yüklenen sayfanın HTML içeriğini alın
html_content = page.content()
try:
# HTML içeriğini lxml'nin fromstring yöntemini kullanarak ayrıştırma
parser = fromstring(html_content)
# Ürün başlığının metin içeriğini ayıklamak için XPath kullanın
product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()
# Çıkarılan ürün başlığını yazdırma
print({"Product Title": product_title})
except IndexError:
# XPath sorgusunun herhangi bir sonuç döndürmediği durumu ele alın
print('Product title not found in the specified location.')
except etree.XMLSyntaxError as parse_err:
# Ayrıştırma sırasında XML sözdizimi hatalarını işleme
print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
# Diğer istisnaları ele alın
print(f'An unexpected error occurred: {e}')
# Tarayıcı bağlamını ve tarayıcıyı kapatma
context.close()
browser.close()
# Playwright oturumunu başlatmak ve komut dosyasını çalıştırmak için sync_playwright kullanın
with sync_playwright() as playwright:
run(playwright)
Python ile web kazıma, web sitelerinden veri toplamak için güçlü bir yöntemdir. Ele alınan araçlar, çeşitli amaçlar için web verilerinin çıkarılmasını, işlenmesini ve depolanmasını kolaylaştırır. Bu süreçte, IP adreslerini değiştirmek için proxy sunucularının kullanılması ve istekler arasında gecikmelerin uygulanması, engelleri aşmak için çok önemlidir. Beautiful Soup yeni başlayanlar için kullanıcı dostudur, lxml ise verimliliği sayesinde büyük veri kümelerini işlemek için uygundur. Daha gelişmiş kazıma ihtiyaçları için, özellikle dinamik olarak yüklenen JavaScript web sitelerinde, Playwright'ın oldukça etkili olduğu kanıtlanmıştır.
Yorumlar: 0