Yeni başlayanlar için adım adım Python web kazıma kılavuzu

Yorumlar: 0

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.

Web kazıma için Python kütüphaneleri

Python, web kazımayı kolaylaştırmak için çeşitli kütüphaneler sağlar. İşte en yaygın kullanılanlardan bazıları:

  • requests: Python için basit ve zarif bir HTTP kütüphanesi, web sayfalarını almak için HTTP istekleri göndermek için kullanılır.
  • Beautiful Soup: HTML ve XML belgelerini ayrıştırmak için harika. Sayfa kaynak kodundan veri çıkarmayı kolaylaştıran ayrıştırma ağaçları oluşturur.
  • lxml: hızı ve verimliliği ile bilinen lxml, XML ve HTML belgelerini ayrıştırmak için mükemmeldir.
  • Playwright: dinamik içerik kazıma ve web sayfalarıyla etkileşim için sağlam bir araç.

HTTP isteklerine giriş

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.

Ortamınızı ayarlama

Ö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

Building web scraper with Beautiful Soup

Statik HTML içeriğini kazıma isteğini kullanan basit bir web kazıyıcı ile başlayalım.

HTTP GET isteği oluşturma

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)

HTTP yanıtlarının işlenmesi

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ını işleme

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!')

HTML öğelerinden veri çıkarma

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.

XPath ve CSS seçicilerini bulma

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:

  1. Açık geliştirici araçları:
    • Chrome'da: Sayfaya sağ tıklayın ve "İncele "yi seçin veya Ctrl+Shift+I (Windows/Linux) ya da Cmd+Opt+I (Mac) tuşlarına basın.
    • Firefox'ta: Sayfaya sağ tıklayın ve "Öğeyi İncele "yi seçin ya da Ctrl+Shift+I (Windows/Linux) veya Cmd+Opt+I (Mac) tuşlarına basın.
  2. Elemanı inceleyin:
    • İncele aracını (imleç simgesi) kullanarak kazımak istediğiniz öğenin üzerine gelin ve tıklayın. Bu, HTML yapı görünümünde öğeyi vurgulayacaktır.
  3. XPath veya CSS seçicisini kopyalayın:
    • Geliştirici araçları bölmesinde vurgulanan HTML öğesine sağ tıklayın.
    • "Kopyala "yı seçin ve ardından "XPath Kopyala" veya "Seçiciyi kopyala "yı (CSS seçici) seçin.

1n.png

XPath: /html/body/div/h1

CSS Selector: body > div > h1

Güzel Çorba kullanarak çıkarma

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ını işleme

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}')

lxml kullanarak çıkarma

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)

Ayrıştırma hatalarını işleme

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}')

Çıkarılan verileri kaydetme

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ış:

Verileri bir CSV dosyasına kaydetme

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')

Verileri bir JSON dosyasına kaydetme

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 ile gelişmiş web kazıma teknikleri

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

Dinamik içeriği kazıma

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.

2n.png

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 yorumlar