Scraper Botlar Hk.
-
Hocalar daha önce hiç bot yazmamıştım, lakin bir sebepten dolayı yazmam gerekti. Şimdi programın iskeleti tamam. HTTP requestler, dom parsing ıvır zıvır hazır. Ancak veriyi çekme stratejisi konusunda kararsız kaldım. Veri kategoriler altında pagination ile listeleniyor. Veri de atıyorum /veri.php?id=x URI'sinde bulunuyor. Önce tek tek kategori altındaki sayfaları gezip ürün idlerini çektikten sonra, veri sayfasından ürünleri mi çekmek mantıklı. Yoksa, /veri.php?id=x'te x'i sıfırdan başlatıp muhtemel her id değeri için bir request gönderip veri var mı yok mu diye kontrol etmek mi mantıklı. Şimdi veri id'leri baya karışık 3000-4000 arası görünüyor ama istisna var mı bilemiyorum. Tek tek her id için request yollamak daha yavaş olur ve ban yeme riskini arttırır gibi geliyor. Diğer türlü crawling de meşakkatli olacak. Normalde botlarda hangi teknik kullanılıyor?
-
benzer bi botta önce kategorilerin bulunduğu sayfadan kategorileri çekip sonra o sayfalardan ürünleri çekmiştim.
idler her zaman düzenli gitmiyor, yayından kaldırılmış bir ürünse mesela bazı sayfaları boşuna ziyaret edersin.
-
hangisi kolayına gidiyorsa, iki türlü de yapabilirsin
en azından max id'yi biliyorsan ve site HEAD destekliyorsa hız kazandırır
önce HEAD çekersin, öyle bir sayfa yoksa zaten 404 döner, var ise GET ile çekersin
hangi dili kullandığını bilmediğimizden anca bu kadar tavsiye verebiliyorum
streaming request destekleyen bir fonksiyon var ise elinde
önce get çekersin (body'yi çekmez) 20x dönerse veri vardır body'yi çekip işlersin
büyük ölçekli bi site değilse nasıl yaptığın pek bir şeyi değiştirmeyecek
bunlara ek olarak kullandığın dilde reusing same connection diye aratırsan, ilk isteği yaptığı socket'i kapatmadan
diğer urlleri de aynı socketten istersin, bu sana tek thread'de bile baya hız kazandırır
-
Eyv hocam sağolasın. Libcurl kullanıyorum php. Bildiğim kadarıyla cURL aynı servera yapılan requestlerde aynı connectionu kullanıyor zaten, öyle değil mi?
Acaba python-scrapy ikilisine mi donsem diye de dusunmuyor değilim.
-
scrapy kullanacaksan sunucuyu iyi gözlemlemek ve scripti iyi ayarlamak gerekir
twisted kullandığından ve default ayarlarla (16 connection pool) hayvan gibi sömürür siteyi
illa scrapy kullanacaksan dikkat çekmeden, sunucunun anasını ağlatmadan çekmek için önereceklerim
http://doc.scrapy.org/en/latest/topics/settings.html
- CONCURRENT_REQUESTS = 1 veya 3
- ram'i sömürmesine engel olmak ve kaldığın yerden devam edebilmek için JOBDIR klasörü belirlenmeli
- verileri daha sonra kolay işleyebilmek adına çıktı formatı olarak ONELINE JSON (-t jl parametresi)
-
Bu konuyu da hallettim. Scrapy işine girmedim hiç. requests ve lxml ile hallettim. Concurrent request işine giremedim. Multithreading de denedim, gevent de denedim, grequests de denedim hiç birisi single process'ten daha iyi performans vermedi. Sanırım hedef site ile ilgili bir durum. Nitekim site Apache Benchmark'ta berbat sonuç veriyor.
-
KrypT bunu yazdı
Eyv hocam sağolasın. Libcurl kullanıyorum php. Bildiğim kadarıyla cURL aynı servera yapılan requestlerde aynı connectionu kullanıyor zaten, öyle değil mi?
Acaba python-scrapy ikilisine mi donsem diye de dusunmuyor değilim.
Scrapy candir.