Python ile Web Crawling

Share Button

Aslında üstüne pek de yazı yazılası bir konu değil ama yine de belki meraklısının işine yarar :)

Herhangibir dille web sitesi crawle etmek için bilinmesi gereken 3 şey

1- Nasıl http isteği gönderebilirim ?
2- Nasıl xpath sorgusu gerçekleştirebilirim ?
3- Elde ettiğim elemanların özelliklerine nasıl ulaşabilirim ?

Dilerseniz konuyu bu başlıklar altında inceleyelim.

1- Nasıl http isteği gönderebilirim ?

Python ile http request gönderebilmek için requests veya urllib2 kütüphanelerini kullanabilirsiniz.

Ben bu yazıdaki örneklerde urllib2 kullanacağım.

Örnek GET isteği:

	url = 'http://edition.cnn.com/'
	try:
		request = urllib2.Request(url)
		response = urllib2.urlopen(request).read()
	except urllib2.URLError:
		print "Connection failed. Url: %s" % url

2- Nasıl xpath sorgusu gerçekleştirebilirim ?

Python ile xpath sorgusu gerçekleştirmek için xml.ElementTree veya lxml kullanabilirsiniz.

Ben bu yazıdaki örneklerde lxml kullanacağım.

Aşağıdaki örnekde, CNN.com sitesindeki haber kategorilerini sorguluyoruz.
Örnek Xpath sorgusu:

	from lxml import html
	query = '//*[@id="intl-menu"]/li/a'
	root = html.fromstring(response)
	categories = root.xpath(query)

3- Elde ettiğim elemanların özelliklerine nasıl ulaşabilirim ?

Bir önceki örnde kullandığım lxml kütüphanesini kullanıyorsanız, xpath sorgusu sonuncunda dönen elemanın DOM özelliklerine ulaşmak için get() metodunu, içindeki metne ulaşmak için text özelliğini, alt elemanlarına ulaşmak için getchildren() metodunu kullanabilirsiniz.

for category in categories:
	children = category.getchildren()
	text = children and children[0].text or category.text
	print text, category.get('href')

Son olarak herşeyi bir araya getirelim.

from lxml import html
import urllib2

url = 'http://edition.cnn.com/'
try:
	request = urllib2.Request(url)
	response = urllib2.urlopen(request).read()
except urllib2.URLError:
	print "Connection failed. Url: %s" % url

query = '//*[@id="intl-menu"]/li/a'
root = html.fromstring(response)
categories = root.xpath(query)

for category in categories:
	children = category.getchildren()
	text = children and children[0].text or category.text
	print text, category.get('href')

Elde edeceğimiz sonuç aşağıdaki biçimde olacaktır.

Home /
Video /video/
World /WORLD/
U.S. /US/
Africa /AFRICA/
Asia /ASIA/
Europe /EUROPE/
Latin America /LATINAMERICA/
Middle East /MIDDLEEAST
Money http://money.cnn.com/INTERNATIONAL/
World Sport /SPORT/
Entertainment /SHOWBIZ/
Tech /TECH/
Travel http://travel.cnn.com/
iReport http://ireport.cnn.com/
Share Button

About İbrahim Gündüz

1983 yılında İstanbul’da doğdu. İlkokul yıllarında cobol ve basic le olan tanışması, yazılıma olan ilgisini arttırdı 2005 yılında. Uludağ Üniversitesi Teknik Bilimler Meslek Yüksek Okulu Elektronik bölümünden mezun olan Gündüz, çeşitli alanlarda faaliyet gösteren kurumlarda yazılım geliştirici olarak görev almıştır.
Mesleki ilgi alanları, ölçeklenebilir sistemler, uygulama entegrasyonları ve ödeme sistemleridir.
Halen Markafoni back end geliştirici olarak çalışmaktadır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir