Tag Archives: Crawling

Genel

Python ile Web Crawling

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/
Programa Dilleri ve Çatıları

PHP ile Crawling İşlemi

PHP ile Data Crawling

Eğer sizde benim gibi crawler yazmayı seviyorsanız, PHP nin DOMXPath objesi bu işi gerçekten oldukca kolaylaştırıyor. Ben daha önceki kendi denemelerimde metin işleme yoluyla aradığım veriye ulaşmayı tercih ediyordum. Ancak bu yöntem zaman açısından oldukca maliyetli oluyordu. Bunun yerine xPath sorgusundan yararlanarak veri çekmek gerçekten çok kolay.

Örnek olarak bigpara.com sitesindeki Dolar kurunun alış fiyatını crawle edelim. İlk olarak crawler kodumuzu yazalım.

mycrawler.php:

$url = ''; # Bu degiskenin icinde crawle edecegimiz sitenin url bilgisi yeralacak.
$xpath = ''; # Bu degiskenin icinde crawle edecegimiz verinin xpath adresi yeralacak.
$htmlContent = file_get_contents($url);
if(!$htmlContent) {
  throw new Exception('Failed to connection.');
}
libxml_use_internal_errors(true);   
$domObj = new DOMDocument();
$domObj->loadHTML($htmlContent);
$xPathObj = new DOMXPath($domObj);
$value = $xPathObj->query($xpath)->item(0)->firstChild->nodeValue;
print $value . PHP_EOL;

Şimdi de crawle edeceğimiz verinin xpath adresini alalım. Bu işlem için google chrome tarayıcısından yararlanacağız. XPath adresini tespit etmek için:

* Sayfayı google chrome ile açtıktan sonra verinin bulunduğu alanda fare ile sağ tıklayarak Inspect Element seçeneğine tıklayın.

* Tarayıcının alt kısmında açılan bölümdeki html kodları arasında okumak istediğiniz metni bulun ve üzerine sağ tıklayarak Copy as xPath seçeneğine tıklayın.

Şimdi de edindiğimiz xpath ve url bilgisini kodumuzun içine yerleştirelim.

$url = 'http://www.bigpara.com/dolar/?bprtme=1463181297&sTo=301'; # Bu degiskenin icinde crawle edecegimiz sitenin url bilgisi yeralacak.
$xpath = '//*[@id="content"]/div[2]/div[1]/div[3]/div[2]/strong'; # Bu degiskenin icinde crawle edecegimiz verinin xpath adresi yeralacak.
...

Artık kodumuzu çalıştırmaya hazırız. Hemen bir terminal açalım ve php betiğimizi çalıştıralım.
shell:

$ php mycrawler.php

Sonuç:

1,985