Python'un kapsamlı ekosistemi, web kazımayı basit bir görev haline getiren sayısız kitaplığa sahiptir ve lxml kesinlikle önde gelen seçeneklerden biridir. Bu eğitim, lxml'in web kazıma için neden mükemmel bir seçim olduğu, sağlam bir lxml kazıyıcı oluşturma adımları ve başlamanıza yardımcı olacak pratik örnekler hakkında kapsamlı bir kılavuz sağlamayı amaçlamaktadır. Öğretici ayrıca web kazıma sırasında maksimum başarılı istek sayısını sağlamak için değerli bilgiler içerir.
Python'da lxml ile Web Scraping'e Giriş
Python'un lxml'sini kullanan web kazıma, indirilen HTML veya XML kodundan verilerin çıkarılmasını ve yapılandırılmasını içerir. Hem indirmeyi hem de ayrıştırmayı gerçekleştiren bazı kitaplıkların aksine, lxml ayrıştırma konusunda uzmanlaşmıştır. Web sayfalarını indirmek için genellikle İstekler gibi bir HTTP istemcisi kullanırsınız. HTML veya XML verileri indirildikten sonra, lxml bu verileri ayrıştırarak belirli öğelere ve niteliklere etkili bir şekilde erişmenize olanak tanır.
Web Kazıma için Neden Python'un lxml'sini Seçmelisiniz?
Web kazıma projeleriniz için lxml'i seçmek çeşitli avantajlarla birlikte gelir:
Avantajları:
- Genişletilebilirlik: libxml2 ve libxslt C kitaplıklarının üzerine inşa edilen lxml, oldukça genişletilebilir ve yerel bir C kitaplığının hız avantajlarını Python'un basitliğiyle birlikte sunar.
- XML Yapısı: XML yapısını belirtmek için üç şema dilini destekler ve XPath'ı tam olarak uygulayarak XML belgelerindeki öğeler arasında gezinmeyi inanılmaz derecede güçlü kılar.
- Veri Geçişi: Çeşitli XML ve HTML yapıları arasında geçiş yapma yeteneği; çocuklar, kardeşler ve diğer öğeler arasında gezinmeye izin verir. Bu özellik ona BeautifulSoup gibi diğer ayrıştırıcılara göre üstünlük sağlar.
- Kaynak Verimliliği: Diğer kitaplıklarla karşılaştırıldığında daha az bellek tüketir, bu da onu büyük veri kümelerinin ayrıştırılmasında oldukça verimli kılar.
Ancak lxml, kötü yazılmış veya bozuk HTML'yi ayrıştırmak için her zaman en iyi seçim değildir. Bu gibi durumlarda bir geri dönüş seçeneği olarak BeautifulSoup'a başvurabilirsiniz.
Python'da Sağlam bir lxml Ayrıştırıcı Oluşturma Adımları
Adım 1: Uygun Araçları Seçin
Kazımaya başlamadan önce doğru alet setini seçmeniz gerekir. HTTP istemcileri için Python aşağıdaki gibi kütüphaneler sunar: Requests
, HTTPX
, Ve aiohttp
. Hedefiniz JavaScript'e dayanan dinamik bir web sitesi ise Selenium gibi başsız bir tarayıcıya da ihtiyacınız olabilir.
Adım 2: Hedef Web Sayfanızı Belirleyin
Araçlarınızı ayarladıktan sonra kazımak istediğiniz web sayfasını tanımlayın. Web sitesinin mutlaka okuyun robots.txt
o sitedeki web kazıma kurallarını bilmek.
Adım 3: Web Scraping Yönergelerini Anlayın
Web kazımanın en iyi uygulamalarını ve CAPTCHA'lar veya IP yasakları gibi potansiyel engelleri anlamak çok önemlidir. Bu tür sorunları öngördüğünüz durumlarda, dönen bir proxy sunucusu kullanmak faydalı olabilir.
Adım 4: Başlıkları Ayarlama
HTTP üstbilgileri gerçek kullanıcı davranışını taklit etmeye yardımcı olur. Kazıyıcınızın tıkanmamasını sağlamak için bunları doğru şekilde ayarlayın.
Python'un lxml'si ile Web Scraping: Adım Adım Bir Eğitim
Önkoşullar
Başlamadan önce aşağıdakilere ihtiyacınız olacak:
- Python 3.x: Sisteminizde Python 3.x'in kurulu olduğundan emin olun. Şuradan indirebilirsiniz Python'un resmi web sitesi.
- Kod Düzenleyici: Python'u destekleyen herhangi bir metin düzenleyicisi işini görecektir, ancak Visual Studio Code, Notepad++ veya PyCharm gibi gelişmiş IDE'ler hata ayıklama, sözdizimi vurgulama ve otomatik tamamlama gibi daha fazla işlevsellik sunabilir.
- İstekler ve lxml kitaplıkları: Bunlar sırasıyla HTTP istekleri ve HTML ayrıştırma için kullanılan üçüncü taraf Python kitaplıklarıdır. Yüklemek için terminalinizi açın ve şunu çalıştırın:
pip install requests lxml
1. Geliştirme Ortamınızı Kurma
Açıklama:
Bu adımda kodlama ortamınızı geliştirmeye hazırlarsınız. Komut dosyanızı kaydetmek istediğiniz bilgisayarınızda bir konum seçin.
- Python Dosyası Oluşturma: Kod düzenleyicinizi açın ve adında yeni bir Python dosyası oluşturun.
imdb_scraper.py
.
2. Web Sayfası İçeriğini Getirme
Kod:
import requests
url = "https://www.imdb.com/chart/moviemeter/"
response = requests.get(url)
if response.status_code == 200:
page_content = response.text
else:
print("Failed to retrieve the page")
Açıklama:
Bu bölümde IMDb'nin en popüler filmler sayfasının HTML içeriğini getirirsiniz.
- İthalat
requests
:requests
kütüphane HTTP istekleri yapmak için kullanılır. - İçerik Getiriliyor:
requests.get(url)
web sayfası içeriğini getirir veresponse
değişken. - Durum Kodu Kontrolü: HTTP durum kodunu kontrol etmek iyi bir uygulamadır (200, tamam demektir). 200 değilse sayfanın getirilmesinde sorun var demektir.
3. Web Sayfasını Ayrıştırma
Kod:
from lxml import html
tree = html.fromstring(page_content)
Açıklama:
Burada getirilen HTML içeriğini aranabilir bir ağaç yapısına dönüştürürsünüz.
- İthalat
lxml.html
: Bu modül HTML içeriğinden bir ağaç yapısı oluşturmaya yardımcı olur. - Ağaç Yapısı Oluşturma:
html.fromstring(page_content)
depolanan HTML içeriğini ayrıştırırpage_content
ve değişkende sakladığınız ağaç benzeri bir yapı oluştururtree
.
4. Veri Çıkarma
Kod:
movie_titles = tree.xpath('//td[@class="titleColumn"]/a/text()')
imdb_ratings = tree.xpath('//td[@class="imdbRating"]/strong/text()')
Açıklama:
Artık web sayfasının ağaç benzeri bir yapısına sahip olduğunuza göre, bu sayfadan veri arayabilir ve çıkarabilirsiniz.
- XPath'ı kullanma: XPath, bir XML belgesinde gezinebilen bir sorgu dilidir. Kazımak istediğiniz öğeleri ve nitelikleri belirtmek için burayı kullanırsınız.
- Başlıkları ve Derecelendirmeleri Çıkarma: Film başlıklarını ve IMDb derecelendirmelerini, HTML yapısındaki konumlarını belirleyen XPath sorgularını kullanarak toplarsınız.
5. Verilerin Saklanması
Kod:
for title, rating in zip(movie_titles, imdb_ratings):
print(f"Movie: {title}, Rating: {rating}")
Açıklama:
Son olarak, kazınmış verileri depolamak veya görüntülemek isteyeceksiniz.
- Listeleri Sıkıştırmak:
zip
işlevi her film başlığını karşılık gelen derecelendirmeyle eşleştirir. - Veri Yazdırma: Bu örnekte, her bir çiftin çıktısını alıyoruz. Gerçek dünyadaki bir uygulamada bu verileri bir veritabanında veya bir dosyada depolamak isteyebilirsiniz.
Tam Kod Örneği
# Importing required libraries
import requests
from lxml import html
# Step 2: Fetch Web Page Content
url = "https://www.imdb.com/chart/moviemeter/"
response = requests.get(url)
if response.status_code == 200:
page_content = response.text
else:
print("Failed to retrieve the page")
# Step 3: Parse the Web Page
tree = html.fromstring(page_content)
# Step 4: Extract Data
movie_titles = tree.xpath('//td[@class="titleColumn"]/a/text()')
imdb_ratings = tree.xpath('//td[@class="imdbRating"]/strong/text()')
# Step 5: Store and/or Output Data
for title, rating in zip(movie_titles, imdb_ratings):
print(f"Movie: {title}, Rating: {rating}")
Bu genişletilmiş ve ayrıntılı öğreticiyi takip ederek, IMDb'den en popüler filmler hakkında güvenle bilgi alabilmelisiniz. Her zaman olduğu gibi, kazıdığınız herhangi bir web sitesinin hizmet şartlarına uymanız çok önemlidir.
Son Açıklamalar
Web kazıma karmaşık bir süreç olabilir, ancak Python'un lxml kitaplığı birçok karmaşıklığı basitleştirir. Doğru araçlar, en iyi uygulamalara ilişkin bilgi ve iyi tanımlanmış bir strateji ile web kazıma çalışmalarınızı verimli ve başarılı hale getirebilirsiniz. Bu eğitimde bu hususların kapsamlı bir şekilde ele alınması amaçlandı. Mutlu kazıma!