Forum'da ara:
Ara


Yazar Mesaj
Mesaj27.12.2016, 01:04 (UTC)    
Mesaj konusu: "Resimler"deki bütün resimleri indirme kodu

Bedava-sitem menüsünden "Resimler" linkine tıklayın. Sayfa açıldıktan sonra geliştirici konsolunu açın (windows için F12) ve konsol (console) sekmesine geçin.

=== EDIT ===

Kod çok daha kısa ve kullanımı kolay olacak şekilde güncellendi. Yine de orijinal gönderiyi silmiyorum.

Yeni kod:

Kod:
fileUpload_fileList.forEach(file => {
  var a = document.createElement('a')
  a.href = file.url
  a.download = true
  a.click()
})


Kodu konsolda çalıştırınca benim kullandığım son sürüm Chrome çoklu indirme için izin istedi, izin verince çok hızlı biçimde dosyaları tek tek indirmeye başladı. Yine de resim sayısı çok fazlaysa süreç biraz uzun olabilir, dikkat edin.

Yeni kodla ilgili daha fazla açıklamayı aşağılarda yeni bir mesajda yaptım.

=== Mesajın buradan sonrası eski gönderiye aittir ===

Aşağıdaki kodu konsola yapıştırıp çalıştırınca bütün resimlerin linkleri alt alta dizili hale gelecek. Kolaylık olsun diye her biri tıklayınca kayboluyor.



Kodu kendim arşivlik resimler sayfamı görünce yazdım. Kendim daha farklı şekilde indirdim ama bu da iş görmeli.

Kod:
function getLinks() {
  var rowsSelector = `tr[id^="fileUploadTableRow"]`
  var rows = document.querySelectorAll(rowsSelector)
  return Array.from(rows).slice(1).map(function(row) {
    return row.querySelector('a').href
  })
}

function paginateTo(pageNumber) {
  fileUpload_generateFileTable_pagination_changePage(pageNumber)
}

function getPageCount() {
  var pagination = document.querySelector('.pagination ul')
  var items = pagination.querySelectorAll('li')
  var numbers = Array.from(items).filter(function(item) {
    return /\d/.test(item.innerText)
  })
  return numbers.length
}

var pageNumber = 0
var pageCount = getPageCount()
var links = []
paginateTo(pageNumber)
var interval = setInterval(function() {
  if (pageNumber >= pageCount) {
    clearInterval(interval)
    document.body.innerHTML = ''
    links.forEach(function(link) {
      var anchor = document.createElement('a')
      var breakingRule = document.createElement('br')
      anchor.href = link
      anchor.download = 'true'
      anchor.innerText = link
      document.body.appendChild(anchor)
      document.body.appendChild(breakingRule)
      anchor.addEventListener('click', function() {
        anchor.remove()
        breakingRule.remove()
      })
    })
  }
  links.push(...getLinks())
  paginateTo(++pageNumber)
}, 60)

______________
Hey maan


En son scriptype tarafından 28.12.2016 21:31:07 tarihinde değiştirildi, toplam 6 kere değiştirildi
Mesaj27.12.2016, 08:58 (UTC)    
Mesaj konusu:

Öncelikle kodlamanızı incelemedim, dediğiniz şekilde işe yarıyorsa ne güzel, kodlamayı bu işleme uygun bir şekilde yazdığınız, buna emek verdiğiniz için sizi tebrik etmek gerekir. Fakat 90'ların indirme yazılımı olarak ünlenen WGET gibi otomatik, işlevsel ve çok boyutlu bir terminal komutu varken, bu kodlama ve ardından yapılan işlemler çok uğraştırıcı, özellikle resim sayısı arttıkça daha da çekilmez bir hâl alabilir, bu yüzden pek kullanılacağını sanmıyorum. Çünkü $ wget -nd -r -l 1 -A jpg,jpeg,png,gif http://img.webme.com/pic/s/scriptype/ gibi tek dizelik bir terminal komutu da aynı işlemi kendi kendine yapar.
______________


En son slobada tarafından 27.12.2016 09:01:40 tarihinde değiştirildi, toplam 1 kere değiştirildi
Mesaj28.12.2016, 00:39 (UTC)    
Mesaj konusu:

Wget'ten haberim vardı ama böyle bir özelliği olduğunu düşünmemiştim. İnternette bununla ilgili olarak, wget'in text dökümanlarını gezerek bulduğu url'lerdeki kaynaklara da kendiliğinden istek yapabildiğini (recursively crawling) buldum – ki sizin verdiğiniz kod da buna yarıyor gibi.

http://img.webme.com/pic/s/scriptype adresinde bütün resimlere referans içeren bir döküman bulunmadığı için bütün resimleri basitçe alabilmek bana mümkün gelmiyor.

Ben kendim sayfadan linklerin listesini çıkarıp curl ile hepsini indirdim. Forumda çoğunluk Windows kullanıyor gibi göründüğü için de forumda paylaşabilmek için curl yerine tarayıcıda ne yapılabilir diye merak edip bu kodu ürettim.
______________
Hey maan
Mesaj28.12.2016, 10:33 (UTC)    
Mesaj konusu:

WGET CURL ile kıyaslandığında daha zayıf daha içi boş gözükse de kararlı bir recursive özelliğinin olması, girilen dizini eksiksiz indirirken gereken işlemleri kendiliğinden yapması bence büyük önceliktir. Link listenizi WGET ile de otomatik bir şekilde indirebilirdiniz. Yukarıdaki kodlamaya gelince; aslında kodlamayı ilk yazdığımda http://img.webme.com/pic/s/scriptype adresi yerine, http://www.bedava-sitem.com/images.php adresini yazmıştım; fakat daha sonra ilgili sayfaya erişim için login işlemleri gerektiğinden ek cookie tanımlamaları ile kodu uzatmak istemediğimden basitçe, o adresle değiştirmiştim; bu yüzden bütün resimlerin bu adresten basitçe alınamayacağını söylemekte haklısınız. Bunun için, öncelikle http://www.bedava-sitem.com/login.php adresinden giriş yapabilmek için kullanıcı adı şifre ekleyip bir cookie dosyası edinir ve daha sonra bu dosyayı kullanarak http://www.bedava-sitem.com/images.php adresindeki kaynak linklerden resimleri otomatik edinebiliriz. Denememekle birlikte; şu şekilde bir kodlama, tüm gerekli işlemleri otomatik olarak yapar diye düşünüyorum:
Kod:
wget --save-cookies cookies.txt \
     --keep-session-cookies \
     --post-data 'user=scriptype&password=sifre' \
     --delete-after \
     http://www.bedava-sitem.com/login.php

wget --load-cookies cookies.txt \
     -r -A jpg,jpeg,png,gif http://www.bedava-sitem.com/images.php

______________
Mesaj28.12.2016, 13:15 (UTC)    
Mesaj konusu:

Bu arada Konsol'da kodunuzu deneme fırsatım oldu, 'querySelectorAll' için property error verdi ve doğal olarak hiçbir işlem yapmadı. Bu noktada kodlamanız yerine bir öneri verecek olursam; Sayfadaki tüm resimlerin linklerini <img src> görüntülemek için şu şekilde bir konsol kodu yazılabilir:
Kod:
$('img').each(function(){
console.log($(this).attr('src'));
});
Bu kod da, sayfadaki tüm resim linklerini liste olarak vermektedir ve sonrasında doğrudan konsol üzerinden indirme yapmak istiyorsanız her URL için tek tek komut yazmanız gerekir. Fakat eğer sayfadaki tüm resimleri hiçbir işlem yapmadan otomatik olarak indirmek istiyorsanız, aşağıdaki gibi bir Konsol kodlaması yazılabilir. Kod konsola yazıldığında hangi sayfa açıksa; o sayfadaki görsellerin linklerini tarayarak hepsini otomatik olarak indirerek bilgisayara kaydeder.
Kod:
var images = document.getElementsByTagName('img');
var srcList = [];
var i = 0;

setInterval(function(){
    if(images.length > i){
        srcList.push(images[i].src);
        var link = document.createElement("a");
        link.id=i;
        link.download = images[i].src;
        link.href = images[i].src;
        link.click();
        i++;
    }
},1500);

______________
Mesaj28.12.2016, 18:02 (UTC)    
Mesaj konusu:

Cevaplar için teşekkürler. Yalnız gözden kaçan önemli bir nokta var; "Resimlerim" sayfasına girince bütün resimleri liste haline getirmenin tek yolu benim yaptığım gibi bir yol izlemek. Ben sadece tek sayfa içerisindeki resimlerin url'lerini toplamıyorum, aynı zamanda sayfalara bölünmüş (paginated) haldeki Resimlerim sayfasındaki bütün sayfalar için bu işlemi yapıyorum. Yani olay tek sayfadaki resimleri jQuery kullanarak ya da kullanmadan gezip linkleri toplamak kadar basit değil; olayın sadece bir parçası bu.

Daha basitçe açıklamak gerekirse, aşağıdaki resimden görüldüğü gibi, çok fazla resim yüklüyse resimler otomatik olarak birden fazla sayfaya bölünüyor.



Ben her sayfadaki her resmin url'ini toplayıp javascript ile havada kendim liste haline getiriyorum. Kod çalışsaydı sayfaların otomatik bi şekilde gezildiğini görecektiniz. Bu arada ben son sürüm chrome ile kodu çalıştırabiliyorum ve çalışması için gerçekten de modern bi tarayıcıya ihtiyaç var – querySelectorAll'da patlaması içinse çok eski bir tarayıcı kullanıyor olmak lazım. Hatayı paylaşabilir misiniz?

Sonuç olarak, anlattığınız mantık tamamen doğru: eğer liste statik olarak o adreste bulunsaydı wget ya da curl ile böyle bir işlemi otomatize etmek için o yöntemler gerekirdi. Ya da sadece ilk sayfadaki resimleri almak istiyorsak. Ama benim bahsettiğim şey javascript ile paginate edilmiş ve ancak javascript ile tümüne ulaşılabilecek bir listeyi alıp indirmek. Javascript runtime'ı olmayan herhangi bir araçla (curl, wget vs) bütün listeye ulaşmak imkansız. Kod da o yüzden sizin verdiğiniz koddan daha uzun.
______________
Hey maan


En son scriptype tarafından 28.12.2016 18:03:57 tarihinde değiştirildi, toplam 1 kere değiştirildi
Mesaj28.12.2016, 21:18 (UTC)    
Mesaj konusu:

Benim gönderdiğim ilk kodun biraz uzun olmasının nedeni bütün resimlerin url'lerini alabilmek için sayfadaki pagination'ı kullanmak gerekmesiydi.

Şimdi bütün listeyi almanın çok daha kolay bir yolunu buldum: Bedava-Sitem bütün linkleri fileUpload_fileList isminde bir değişkende tutuyormuş. Dolayısıyla geriye kalan tek şey listeyi dönüp her bir linki download edilebilir hale getirip download tetiklemek oldu.

Yeni kodu ilk mesajı editleyerek en üste koydum. Chrome'da ilk kez gördüğüm "çoklu dosya indirme izni" penceresi çıkıyor ve onaylayınca indirmeler başlıyor.

Kod üzerinde tekrar tekrar düşünmeme neden olan ve konuyu bu forumdan hiç beklemediğim seviyede argümanlarla sıcak tutan slobada'ya teşekkürler.
______________
Hey maan
Mesaj30.12.2016, 16:39 (UTC)    
Mesaj konusu:

Merhaba scriptype kodlamanızı oldukça kısaltmışsınız ve tüm tarayıcılarda çalışır duruma getirmişsiniz, bence bu gerçekten bir başarıdır, bunun için tebrikler. Fakat size şunu söylemek isterim ki; bu tür teknolojilerde bir işlem için tek yol tanımı nadiren kullanılır -ki bu tezinizi de bir sonraki mesajınızda kendiniz çürütmüşsünüz. Ayrıca sizin de gözden kaçırdığınız önemli bir nokta var. Resimlerim sayfasına girildiğinde; sayfalamaya göre içerik değiştiği gibi aynı zamanda selectbox'a göre de içerik değişmektedir ve şu andaki yazdığımız veya yazılan konsol komutları Source üzerinden çalıştığı için tüm Resimlerim dizinini değil, sadece görüntülenmekte olan seçili sınıf içeriklerini indirmektedir, yani sizin eklediğiniz görseldeki option value=0 diğer adıyla Genel (266 Resimler) sınıfını. Dizini yansılama yaparak olduğu gibi indirmek için şu anda wget dışında aklıma pratik bir yöntem gelmiyor; fakat benim aklıma başka yöntem gelmemesi, -siz de hak verirsiniz ki- bunu tek yol yapmaz. Umarım bunu açıklayabilmişimdir.
Ayrıca mesajlarıma eklemiş olduğum kodları genel kullanım için Resimlerim sayfasını incelemeden yapısını göz önüne almadan yazmıştım, bu yüzden Resimlerim sayfasının sayfalandırılmış yapısı hakkında getirdiğiniz eleştirilerinizde haklısınız. Dizindeki içerikleri hiçbir şekilde dinamiklik öğelerinden etkilenmeden indirmek için daha ayrı ve pratik bir yöntem vardır, bunu vakit buldukça araştırmak veya yoksa geliştirmek gerek. Son olarak kodlama ve anlatım üzerinde bu kadar emek verdiğiniz, kodlamanıza getirilmiş eleştirileri dikkate aldığınız ve birebir ilgili sayfaya özel bir kodlama geliştirerek ihtiyacı olanlar için bu şekilde bir kolaylığı oluşturduğunuz için ben de size teşekkür ederim. İyi çalışmalar.
______________
Önceki mesajları göster:   


Powered by phpBB © 2001, 2005 phpBB Group
Türkçe Çeviri: phpBB Türkiye & Erdem Çorapçıoğlu