Wget és képlink leszedése

Fórumok

Sziasztok! Elég kezdő vagyok a témában még de az lenne a feladatom,hogy egy oan basht kell írnom, ami összegyűjti az osszes a ( mindegy melyik oldal pl: az origo) oldalán található
kep vagy képek linkjének cimet. És nem hasznalhatom ki, hogy a wget parancs kepes
rekurzivan letolteni a web oldalakat.

Na most ha ugye a wgetnek simán megadom,hogy http://vwww.vmi.hu akkor ugye azt csak az index html-t szedi és ebben kéne kikeresnem egy greppel a relatív kép hivatkozásokat(img src asszem ez a nevük), majd ezeket amiket kigreppelek letölteni. Csak nem tudom,hogy ha az elején leszedem az index.html-t hogyan tudok keresni. Légyszi segítsetek! Köszi

Hozzászólások

Bár nem olyan egyszerű így a feladat mint ahogy elsőre látszik, de már félig meg is oldottad. A két fő lépésből (oldal letöltése és a szűrés) az első már megvan. A másodikhoz szükséged lesz a keresendő minta megállapítására. Tehát az "img src asszem ez a nevük" mellett utána kellene nézned a img tag használatának. Ha ez megvan, meg tudod mondani, hogy pontosan mit is keresel a HTML oldalon, és így felépíthető egy olyan kifejezés a grephez, sedhez, amivel ki tudod szűrni a megfelelő URL-t. Figyelj arra, hogy az img és a src biztosan egymás mellett van-e, milyen karakterek, és hány darab választhatja el ezeket. Ez az URL viszont lehet hogy relatív, nem tartalmaz host részt. Ezt is figyelembe kell venned akkor, amikor összeállítod a teljes URL-t a képek tényleges letöltéséhez.

De először azt kellene megtudni, hogy a feladat szerint milyen eszközök használhatóak, ugyebár a wget rekurzív funkciója tiltott. Van még ilyen? Például egrep, sed, cut, regexp, awk, perl? Illetve mi az ami alkalmazható (iskolai feladat esetén már tanult) dolog?

A gyakorlati megoldásban segítünk, de csak akkor tudunk, ha ismerjük a feltételeket. Ehhez tartozna a pontos feladatkiírás is, és az alkalmazható és tiltott eljárások is. A fórumtagok valószínűleg tíznél több különféle megoldást tudnak adni, de ha ezek a kiírás miatt nem felelnek meg, akkor nincs sok értelme.

A legegyszerűbb a golgota által ajánlott módszer lenne, de ez kiesik.

Látom, közben alakul a dolog, viszont felhívnám a figyelmet a fent említett érdekességekre (amik például a grep használatakor okozhatnak találatvesztést).

Próbáltam egy olyan öszvér HTML példát írni, ami rávilágít a buktatókra, úgymint a tagek sorrendje, betűnagyság, a szeparátor karakterek száma, sortörés, relatív útvonal, többszörös szeparátor az URL-ben:

<IMG   id="kep1"  alt="Elso kep" logdesc="Juliskarol"
   title="Juliska a haz elott"     src="../..//juliska képei 2008/Juliska.JPG">

A fentebb emlegetett probléma simán megoldható, ha a sortöréseket lecseréled szóközre, majd a ">" jeleket ">\n"-re. Ezzel egy tag egy sor, a számodra érdekes tageket grep-pel kinyered, utána már csak darabolni kell a megfelelő helyeken (src=" az elgyik, a következő " meg a másik), és letölteni.

Adok főbb részleteket, ötleteket, nézd meg, értsd meg, és próbáld meg összerakni egy scriptbe. Ehhez a lentieken túl nem kell más bonyolultabb dolgot alkalmaznod, csak ciklus (for) és feltételvizsgálat (if).

Valami pszeudokódszerű leírással:


  ha sikerült az indexfile letöltése
    találjuk meg az img src URL-eket
    minden megtalált URL-re:
      ha relatív az URL
        tegyük elé a protokoll + host + útvonal + "/" részt
      ha nem sikerül letölteni a képet
        hibaüzenet
  különben
    hibaüzenet

A teljes URL protokoll-host-path része, a file kivételével:

  protohostpath=$(echo $url | sed -r 's/^(.+:\/\/)(.+\/+|.+)\/+.*$/\1\2/')

Indexfile letöltése:

  wget -O tmp "$url" >/dev/null 2>&1

Az img tag src része a letöltött indexfile-ból olvasva és visszaírva új sorba, két egyedi(nek vélt) szövegrész közé:

  sed -i -r -e 's/<img(\ +|\ +.*\ +)src="([^"]+)".*>/\nIMAGESOURCE=\2=ECRUOSEGAMI\n/gi' tmp

Az URL kivétele:

  egrep '^IMAGESOURCE=.+=ECRUOSEGAMI$' tmp | sed -r 's/^IMAGESOURCE=(.+)=ECRUOSEGAMI$/\1/g'

Relatív-e az URL:

  if (echo $A | egrep -v '^.+:\/\/.*' >>/dev/null)

Abszolút URL:

  A="$protohostpath/$A"

A fentiek nem minden esetben működnek (pl. ékezetes karakterek az img tagen belül, Javascript által összeállított URL stb.), és nem is feltétlen a legegyszerűbben és legpontosabban írtam le, de kiindulásnak jó lehet.

Ha megvagy az összerakással, és nem megy, másold ide az általad írt változatot, és közösen megpróbáljuk javítani.

wget --follow-tags=img -r http://host

man wget
--follow-tags=list
Wget has an internal table of HTML tag / attribute pairs that it
considers when looking for linked documents during a recursive
retrieval. If a user wants only a subset of those tags to be con‐
sidered, however, he or she should be specify such tags in a comma-
separated list with this option.

"wget --follow-tags=img -r http://host"

És ez megy a -r nélkül is? A topiknyitó ezt írta:
"És nem hasznalhatom ki, hogy a wget parancs kepes rekurzivan letolteni a web oldalakat."

Valószínűleg iskolai feladat, mivel van wget, de ki van kötve, hogy bizonyos funkció nem használható a faladat megoldásához.

elsiklottam felette....bocsi
természetesen megy -r nélkül is a dolog. Ha a -p paramétert is használja, akkor az external weboldalakról is leszedi a képeket ha van ilyen az oldalon. Persze ha a robot.txt engedi az external oldalon.

tehát
wget -E -H -k -K -p --follow-tags=img https://host
persze a paramétereket lehet változtatni :)

Ez is jó és tökéletesen működő változat, és az előzővel együtt ezek a legegyszerűbbek. Viszont ez is rekurzív letöltést használ ki, ámbár nem a --recursive "Turn on recursive retrieving.", hanem a --page-requisites kapcsolóval. Innen már a tanerő értelmezésén múlik a dolog, bár tartok tőle, hogy nem véletlenül van a rekurzió feketelistán, hanem azért, hogy tényleg egy egysorosnál hosszabb bash scriptet kelljen megírnia.

lynx -dump -listonly
Aztan ezt atadni a wget-nek.

Na van egy ien lehetőség a megoldásra valami ilyesmi kellene nekem is ,hogy
#!/bin/bash
url=http://www.origo.hu/
lynx -dump -listonly $url > tmp
cat tmp | grep $url | cut -d . -f2-5 > linkek.txt
wget --input-file=linkek.txt
for ((i=2; i<20; i++))
do
cat index.html | grep 'img src=' | cut -d \" -f $i >>tmp2
done
cat tmp2 | grep 'jpg' > img
wget img

A lynxszel lementem az összes oldalhivatkozást, utána ebből csak azokat hagyom meg, amik belső hivatkozások. Letöltöm a hivatkozásokat és ezekben keresem az img src=-t. Amint látjátok ez elég hiányos Ezek után pedig megkeresem benne a képeket, mert kiszed mindent belőle. És ennél se tudom, hogy kellene megadni több kiterjesztést pl png, gif. Segítségeteket előre is köszi!

Esetleg valami ilyesmi?

Finomits rajta, mert annyira nem jo...
(index.hu-ra)

wget http://index.hu; for i in $(cat < ./index.html |grep "src=.*" |grep img |awk -F'

hasonlora gondoltal? Nincs benne rekurziv wget... Bar nem ertem miert kellene... Kell az egesz, mondjuk index oldalan levo osszes hivatkozasban talalhato kep is, vagy mifene?

Nem illesztette be, bocs...

wget http://index.hu ; for i in $(cat < ./index.html |grep "src=.*" |grep img |awk -F'

Besz.rok, nem tudom beillesyteni...

wget http://index.hu ; for i in $(cat < ./index.html |grep "src=.*" \
|grep img |awk -F'
|awk -F'"' '{print $1}' |grep -v "?.*="); do wget $i ; done

Meg1x

wget http://index.hu ; for i in $(cat ./index.html |grep "src=.*" |grep img |awk -F'img' '{print $2}' |awk -F'src="' '{print $2}' |awk -F'"' '{print $1}' |grep -v "?.*="); do wget $i ; done

Lehet hülyeséget fogok kérdezni illetve mondani, de az awk itt (awk -F'img' '{print $2}' |awk -F'src="' '{print $2}') kiszűri az img és az src-ket úgy,hogy csak a minden sor második szavát teszi bele? ( mármint gondolom azért mert sorszámozza adja át a wget ) és ez a itt a végén mit csinál?|awk -F'"' '{print $1}' |grep -v "?.*=");

Köszi a segítséget!

Az utolsó grep hatására kikerül a listából az összes olyan találat, ahol a kép URL-je kérdőjelet követően paraméterlistát tartalmaz, így ezeket a képeket nem is próblja letölteni. Szerintem ez a rész teljesen felesleges.

"az awk itt ... kiszűri az img és az src-ket úgy,hogy csak a minden sor második szavát teszi bele?"
Az img stringet mint mezőelválasztót használva kiírja a második mező tartalmát (az első a < tag, a második az img utáni maradék a sor végéig). Utána ugyanezt teszi az img helyett a src=" határolóval is. A kettő után az img src URL-je, az azt záró idézőjel, és az utána következő, a sor végéig tartó rész marad.

"...( mármint gondolom azért mert sorszámozza adja át a wget )..."
A wgethez nincs köze, az csak az egy file-t hoz létre a letöltés után.

"és ez a itt a végén mit csinál?"
Az idézőjelet mint szeparátort használva az első mezőt írja ki, ami az src URL-jének végéig tart, így csak az URL marad.

Sajnos ez így az egy sorba írt tagek közül csak az elsőt dolgozza fel, minden sorból csak az elsőt, a többi elveszik. Az "img" helyett érdemes lenne "<img" formában keresni. Illetve mindketőt case insensitive módon, mivel a HTML ezt megengedi.

Sajnos ez így az egy sorba írt tagek közül csak az elsőt dolgozza fel, minden sorból csak az elsőt, a többi elveszik. Az "img" helyett érdemes lenne "

Ez igy is volt eredetileg, csak nem akarta beillesyteni ide es nagyon kellett sietnem... :D

Stra, szoval jogos az img-re vonatkozo megjegyzes. Eredetileg ott volt a "<" jel is elotte, csak ide nem akarta beleszurni, nekem meg sietnem kellett...