tr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski 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 Python web kazıma eğitiminde, veri çıkarmanı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 gibi kazıma görevleri için uygun temel kütüphaneleri tanıtacağız.
Süreci basitleştiren birçok Python web kazıma kütüphanesi vardır. Aşağıda en popüler olanlardan bazıları verilmiştir:
Python kullanarak bir web sitesini nasıl kazıyacağınızı merak ediyorsanız, HTTP isteklerinin nasıl çalıştığını anlamakla baş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. Sunucu, web sayfası olarak işlediği yanıtı tarayıcıya geri gönderir. Web kazıma için, bu süreci taklit etmeniz ve web sayfalarının içeriğini programlı olarak almak için kodunuzdan 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)
Beautiful Soup gibi, lxml de lxml.etree.XMLSyntaxError gibi istisnaları kullanarak sorunları yakalamanıza ve incelikle ele almanıza olanak tanır.
Sağlanan "Python web kazıma kodu", Playwright ve lxml kullanarak bir Amazon ürün sayfasında veri çıkarma işlemi gerçekleştirir. Bir proxy kurar ve bir tarayıcı başlatır, ürün sayfasına gider, öğelerle etkileşime girer, tam sayfa yüklemesini bekler ve sayfa kaynağını yakalar.
Bu içerik, bir öğe ağacı oluşturmak için lxml kullanılarak ayrıştırılır ve ürün başlığını çıkarmak için XPath kullanılır. Kod, öğenin bulunamadığı veya ayrıştırmanın başarısız olduğu durumları ele alır. Kazıma işleminden sonra, tarayıcı oturumunu düzgün bir şekilde kapatır.
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 Python web kazıma kodu, Playwright ve lxml kullanarak bir Amazon ürün sayfasında veri çıkarma 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 yeni bir tarayıcı örneği başlatarak ve başlıksız modda, tarayıcı eylemlerini gözlemlememize izin vererek başlar. 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şimler tamamlandığında ve sayfa tamamen yüklendiğinde, sayfa içeriği yakalanır.
Bu içerik daha sonra bir öğe ağacı oluşturmak için lxml'deki 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 ayıklamak için bir XPath sorgusu kullanılır. Kod, XPath sorgusunun sonuç döndürmede başarısız olabileceği, ayrıştırma sırasında XML sözdizimiyle ilgili sorunların ortaya çıktığı veya beklenmedik bir şekilde başka bir şeyin yanlış gittiği durumları ele almak için tasarlanmıştır. Sonunda, lxml ile çıkarılan ürün başlığı yazdırılır ve oturumu bitirmek için hem tarayıcı bağlamı hem de tarayıcının kendisi düzgün bir şekilde 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.
Bu Python web kazıma eğitimi, Beautiful Soup, lxml ve Playwright gibi kütüphaneleri kullanarak otomatik veri çıkarımı için pratik yöntemleri özetlemektedir. Teknik açıdan, web kazıma nedir Python, web sitelerinden yapılandırılmış verileri sistematik olarak almak ve işlemek için Python tabanlı araçların kullanılmasını ifade eder.
İster statik içerikle ister JavaScript ile oluşturulmuş sayfalarla çalışıyor olun, bu iş için bir Python aracı vardır. HTTP isteklerini öğrenerek, ayrıştırmada ustalaşarak ve veri çıkarmayı anlayarak güvenilir kazıyıcılar oluşturmaya hazırsınız.
İlerledikçe, etik kazıma uygulamalarını takip etmeyi unutmayın - robots.txt'ye saygı gösterin, sunucuları bunaltmaktan kaçının ve verileri her zaman sorumlu bir şekilde kullanın. Sağlam bir temel oluşturduktan sonra, artık güvenle kendi kazıma projelerinizi geliştirmeye başlayabilir ve web verilerinin tüm potansiyelini ortaya çıkarabilirsiniz.
Yorumlar: 0