Scrapy - Açık Kaynak Örümcek
-
Python ile yazılmış bir framework.
http://scrapy.org/
Merak ettiğim daha öncesinde projesinde kullanmış olan var mı?Bunu ya da apache nutch'u projemde (sitelerdeki belirli verileri toplama) kullanacağım ama hangisinin daha verimli olacağı konusunda kararsızım. Yabancı forumlarda genelde nutch övülmüş ama kullanımının zor olduğu yazıyor. Ek olarak nutch java ile yazılmış. Oldum olası java'ya ısınamadım (belki de beceremediğim içindir :) ). O yüzden python ile yazılmış scrapy'e daha sıcak yaklaşıyorum.
Öneri, tavsiye, herbir şeye açığım...
-
Ben kullandım baya basit bir araç.
Biz belli sitelerden veri toplayıp işlemek için kullanmıştım gidiyor tüm siteyi topluyor indexliyor sonrada biz işlemeye başlıyorduk.Biraz yavaş ve veritabanına kaydetme konusunda biraz sıkıntılıydı ama şu anki durumunu bilmiyorum.
En büyük artısı arama sonuclarını xml olarak verebiliyor
-
o değilde sphider i kullanayım dedim 2 site indexledim 1.5 cgb veri tabanı oldu yuh amk :D
-
sandman bunu yazdı
Ben kullandım baya basit bir araç.
Biz belli sitelerden veri toplayıp işlemek için kullanmıştım gidiyor tüm siteyi topluyor indexliyor sonrada biz işlemeye başlıyorduk.Biraz yavaş ve veritabanına kaydetme konusunda biraz sıkıntılıydı ama şu anki durumunu bilmiyorum.
En büyük artısı arama sonuclarını xml olarak verebiliyor
Teşekkür ederim, ayıklamayı yaptıktan sonra verileri xml olarak vermesi yeterli. Çok fazla site olmayacak zaten.
Biraz kurcalayayım, gün sonunda becerebilirsem bir örnek yüklerim. :)ErotikPanda bunu yazdıo değilde sphider i kullanayım dedim 2 site indexledim 1.5 cgb veri tabanı oldu yuh amk :D
derinliği ayarlamazsan, tüm linkleri takip ettirirsen olacağı buydu. :)
-
xPath'e biraz(!) çalışmam gerek anlaşılan. Türkçe bulabildiğim dişe dokunur tek kaynak:
http://www.halitalptekin.com/tag/scrapy.html
Sadece tahribat aktif konuları listeleyen böcük için:from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from tbt.items import TbtItem class MySpider(BaseSpider): name = "tbt" allowed_domains = ["tahribat.com"] start_urls = ["http://tahribat.com/Aktif-Forum-Konulari/"] def parse(self, response): hxs = HtmlXPathSelector(response) titles = hxs.select('//td[contains(@onmouseover, "this.className=\'Tip2 Aktif\'")]') items = [] for titles in titles: item = TbtItem() item ["title"] = titles.select("a[1]/text()").extract() items.append(item) return items
Her seferinde kodu çalıştırıp çıktıya bakmaktansa
scrapy shell http://tahribat.com/Aktif-Forum-Konulari/
ardından doğru yolu bulabilmek için burada denemeleri yapabilirsiniz. Üsttekiyle aynı işi yapan kod:hxs.select('//td[contains(@onmouseover, "this.className=\'Tip2 Aktif\'")]/a[1]/text()').extract()
örnek çıktı:
-----------------------
title
,Ankara‘da Cisco CCNP Eğitimi Almak İsteyenler.
,Ses Kalınlaştırılabilir Mi ?
,Müslüm Gürses‘ten Ümit Kesildi.
,Lozan Antlaşmasının Gizli Maddeleri
,Hamachi Ile Dota Nasıl Oynanır ?
,VirtualBox Sanal İşletim Sistemlerinin Birbirini Görmesi
,Rus Gencine Yıllardır Bakan Türk Kadını
,Çin Kargo Takip Sitesi
,DriverScanner Serial Key ?
.......
----------------------Çıktıları istediğiniz formatta almak için 2 örnek:
scrapy crawl tbt -o cikti.csv -t csv
scrapy crawl tbt -o cikti.xml -t xmlSon olarak http://stackoverflow.com scrapy için eşsiz bir nimet.
Kolay gelsin.
-
belki yeri değil ama ben de bir şey sorayım, bir sitenin bir sayfasını tam olarak kopyalayan bir yazılım var mı?
örneğin youtube sayfası veriyorsun, video dosyası da dahil indiriyor?
-
sandman bunu yazdı
Ben kullandım baya basit bir araç.
Biz belli sitelerden veri toplayıp işlemek için kullanmıştım gidiyor tüm siteyi topluyor indexliyor sonrada biz işlemeye başlıyorduk.Biraz yavaş ve veritabanına kaydetme konusunda biraz sıkıntılıydı ama şu anki durumunu bilmiyorum.
En büyük artısı arama sonuclarını xml olarak verebiliyor
Senin bana seneler önce önerdiğin vardı buydu galba. İndirip incelemiştim. Canım çıkmıştıda , ona rağmen kodları tam çözememiştim.
-
Daft bunu yazdı
belki yeri değil ama ben de bir şey sorayım, bir sitenin bir sayfasını tam olarak kopyalayan bir yazılım var mı?
örneğin youtube sayfası veriyorsun, video dosyası da dahil indiriyor?
indirme işi için wget kullanılabilir. Youtube taki gibi videoları indirmek istiyorsan farklı parametreleri kullanabilirsin.
Ama bazı siteler içeriklerini gizli yapar; ücretli video sitesidir (ztv, vitaminegitim gibi). Bunlarda videoları indirmek için farklı yöntemler kullanırsın. URL sniff yapabilirsin, stream downloader vs. kullanabilirsin.
Kısacası indirmek istediğin içeriğe göre yöntem değişir.
-
telekom bunu yazdıErotikPanda bunu yazdı
o değilde sphider i kullanayım dedim 2 site indexledim 1.5 cgb veri tabanı oldu yuh amk :D
derinliği ayarlamazsan, tüm linkleri takip ettirirsen olacağı buydu. :)
Hacı bu işin derinliğimi olur tabi herşeyi indexleyecek. Yoksa ne anlamı kalıyo :)
-
2 günlük tatil iyi geldi, bu seferki biraz daha ayrıntılı bir örümcek. :)
Ne yapıyor:
Aktif konulara girdikten sonra her konuya teker teker bakıyor. Bu arada geldiği url'yi, konu başlığını ve konunun ilk mesajını kayıt ediyor.items.py içeriği:
from scrapy.item import Item, Field class Tbt2Item(Item): url = Field() konu = Field() ilkmesaj = Field()
Örümceğin (tbt.py) içeriği:
from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.selector import HtmlXPathSelector from tbt2.items import Tbt2Item class TbtSpider(CrawlSpider): # örümceğin ismi tbt2 name = 'tbt2' # Nereden başlangıç yapacağımızı yazalım. start_urls = ['http://tahribat.com/Aktif-Forum-Konulari'] # Burada hangi linklerin takip edileceğini belirteceğiz, bunun için regex i kullandım. Aşağıdaki ifadede neler olduğuna gelince: Forum la başlayan devamında alfabedeki büyük küçük karakterlerin, rakamların veya tire işaretinin kullanıldığı tüm linkleri takip et dedik. Yalnız bazı konuların 2-3-4... gibi devam eden ek sayfaları takip etmemek için \/(?![0-9]) desenini de ekledim. Son olarak da bu kurala uyan tüm linkleri parselle fonksiyonuna havale ettik. rules = [Rule(SgmlLinkExtractor(allow=[r'(Forum)([a-zA-Z0-9-])+\/(?![0-9])']), 'parselle')] # parsellediğimiz linklere ne olacağını burada belirleyeceğiz. def parselle(self, response): # Bu sefer de xpath i kullanacağız. x = HtmlXPathSelector(response) icerik = Tbt2Item() # geldiğimiz url yi url değişkenine atayalım. icerik['url'] = response.url # Konu başlığını almak için class'i Sol olan tüm td etiketlerinin içerisindeki yazı kısmını 'text()' çekiyoruz. Yalnız araya boşluklar da kaynadığı için burada xpath ile regex'i birlikte kullandım. regex sayesinde sadece yazının yani konu başlığının olduğu kısmı aldım. icerik['konu'] = x.select('//td[@class=\'Sol\']/text()').re(r'\w+.*') # Burayı nasıl anlatacağımı bilemedim birden :) Konudaki ilk mesajın yolunu tarif ettik. Nedendir bilmem tbody etiketini kabul etmedi. Bende can sıkıntısı işte neredeyse bütün yolu yazdım. Bir noktaya dikkat etmenizi istiyorum belirttiğimiz yolun sonlarına doğru /text() kullandık. Bu yüzden ilk mesaj içerisindeki linkler, kodlar vs. alınmayacaktır. Eğer tüm içeriği almak isterseniz /text() kısmını silmeniz yeterli. icerik['ilkmesaj'] = x.select('//table[@id=\'mainforumconent\']/tr/td/div[1]/table[@class=\'categorytable\']/tr[2]/td[2]/div[1][@class=\'forummsg\']/p/text()').extract() return icerik
xml örnek çıktı:
<?xml version="1.0" encoding="utf-8"?> <items> <item> <url> http://tahribat.com/Forum-Oyku-Kitabim-177413/ </url> <ilkmesaj> <value> Sa beyler daha oncede konu acmistim hatirlamayanlar icin ozet geciyim yazarlik yetenegim var 300 kusur oyku yazdim gyzellerinden secip bastirmak istiyorum korku ve fantastik tarzda oykuler ve okuyanlar begendiklerini belirttiler sadede gelelim sevmedigim bir iste calisiyorum ve isi birakmak icinde 40 50m bi garantiye ihtiyacim var ama turkiyede bir oyku kitabi nekadar satabilir kestiremiyorum sizce? Para icin yazilmaZ muabbetine girmesseniz sevinirim hacilar ayrica telden yaziyorum ozensiz yazi... </value> </ilkmesaj> <konu> <value> ykü Kitabım </value> </konu> </item> <items>
csv örnek çıktı:
url,ilkmesaj,konu http://tahribat.com/Forum-Kablosuz-Modem-Access-Point-171072/,Hocalar şimdi benim evde net ve birde kablosuz modem var. Ben bununla beraber neti ev içinde rahatça kullanıyorum. Neyse kuzende neti kullanmak istedi ve üst kattan alt kata kablo çektik bunun için. Daha sonra kuzen bu kabloyu kendi kablosuz modemime bağlamış ve kullanıyorum diyor ama çok yakından çekiyormuş. Uzaklardan çekmiyormuş. Nedeni ne olabilir. Ve ben kendi bilgisayarımdan kuzenin modemine erişim sağlayabilir miyim ?,"Kablosuz Modem / Access Point "
İndir: http://www.dosya.tc/server6/C1BVNG/tbt2.zip.html
Not:
Açıklama satırları indirilebilir kodlarda yok.
İşin ustası falan değilim, zor soru sormayın. :)Tavsiye:
Bu işe girişmeden önce düzenli ifadeler (regex) ve xpath'e göz atın. Doğru desenleri bulması biraz(!) sıkıntılı olabiliyor.
regex denemeleri için http://gskinner.com/RegExr/ adresini kullanabilirsiniz.
Takıldığınız bir noktayı internette aramadan önce manuel e bakmanızda fayda var: http://doc.scrapy.org/en/0.16/index.html
Xpath için size yardımcı olabilecek Firefox'ta Firebug, Google Chrome'da da xpathOnClick0.0.0.6 eklentisini tavsiye ederim. -
çizik