Bonjour,

J'ai cr un code perl , pour aspirer les jpeg de fond d'cran d'un site.
Ca marche plutt bien, sauf que les images tlcharges sont au format JFIF(jpeg) , et devraient s'afficher correctement dans un navigateur , ce qui n'est pas le cas.

J'ai tent de comparer les images tlcharges normalement par le navigateur, il y a quelques diffrences , mais minimes , les enttes JFIF sont bien l , et l'image devrait s'afficher, pourtant ca ne marche pas.

Voici le code src

Code : Slectionner tout - Visualiser dans une fentre part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
 use LWP::UserAgent;
  use HTML::LinkExtor;
  use URI::URL;
  use warnings;
  use strict;
 
  my $url = "http://www.google.fr";  # for instance
  my $ua = LWP::UserAgent->new;
  $ua->timeout(30);
 
 
 
 if ($ARGV[0] ne '') {$url= $ARGV[0];}
 
 
 if (!($url=~/^http/i)) {$url="http://".$url;}
 
  print "Recherche de liens sur $url\n";
 
  # Tableau global nécessaire a l'objet LinkExtor
  my @imgs = ();
 
  # Tableau des liens
  my @tablinks=();
 
  sub callback {
     my($tag, %attr) = @_;
 
     #return if $tag ne 'select';  # for a href
     push(@imgs, values %attr);
  }
 
 
sub try_url {
  my ($url) = @_;
  my $p;
  my $res;
  my $base;
 
  @imgs=();
 
  # Make the parser.  Unfortunately, we don't know the base yet
  # (it might be different from $url)
  $p = HTML::LinkExtor->new(\&callback);
 
  # Request document and parse it as it arrives
  $res = $ua->request(HTTP::Request->new(GET => $url), sub {$p->parse($_[0])} );
 
  # Expand all URLs to absolute ones
 $base = $res->base;
  @imgs = map { $_ = url($_, $base)->abs; } @imgs;
 
  return @imgs;
}
 
sub compare_tableau {
my $ref_tab1=shift;
my $ref_tab2=shift;
my %temp;
my @tabfinal=();
 
#print "Comparaison du contenu de tab1 dans =>tab2\n";
 
@temp{@$ref_tab1} = 0..$#$ref_tab1;
 
  for my $val (@$ref_tab2) {
    if( exists $temp{$val} ) {
 
      #print "$val est présent \n";
 
    } else {
      push(@tabfinal,$val);   
      #print "$val n'est pas dans tab1.\n";
 
    }
  }
 
return @tabfinal; 
}
 
sub estpresent {
my $ref_url=shift;
my $ref_tablinks=shift;
 
 
 
#print "\n Compare $$ref_url avec @$ref_tablinks \n";
 
 
for (@$ref_tablinks)
    {
        #if (exists $temp{$_}) {
        if ($_ eq $$ref_url){
 
                                return 1;
                                }
    }
 
return 0;
}
 
 
 
sub parse_allurls {
 my ($url) =@_;
 my @tablocal=();
 
 
 #$recherche=join('\n',@tablinks);
 
 #if (!($recherche=~/$url/i))
 if (!(estpresent(\$url,\@tablinks)))
            {
 
            print "\nAppel de $url";
            @tablocal=try_url($url);
            push (@tablinks,$url);
 
            #print "\n------------------\n";
            #print "\n Elements extraits de $url \n";
            #print "\n @tablocal\n";
            #print "\n------------------\n";
 
            # Purge des élèments déja parcourus
            # dans tablocal
            @tablocal=compare_tableau(\@tablinks,\@tablocal);
 
 
            # Appel récursif
            foreach (@tablocal)
                {
                    if ($_=~/.*?\.jpg/)
                    {
                    print "\n => $_ \n";
                    }
 
                    #print "\nAppel récursif de $_\n\n";
                    if ((!($_=~/^https/i)) && (!($_=~/.*?\.jpg/)) && (!($_=~/.*?\.pdf/)))
                    {
                    parse_allurls($_);
                    }
                }
 
            }
    else
    {
            print "Url ".$_." déja parcourue\n";
    }
 
 
 
}
 
#parse_allurls($url);
 
 my $response = $ua->get($url);
 my @tablines=();
 my %links=();
 my $nomfichier;
 my $urlfichier;
 my $mystream;
 
 if ($response->is_success) {
     @tablines=split('\n',$response->decoded_content);  # or whatever
 }
 
 foreach (@tablines)
 {
    if ($_=~/javascript\:imgload\('(.*?)',.*?,'(.*?)'\).*?$/mi)
    {
    #push (@links,"$url/wallpaper/7yz4ma1/0".$2."_".$1."_1280x1024.jpg");
    #push (@myfiles,$1);
    $links{$1}="$url/wallpaper/7yz4ma1/0".$2."_".$1."_1280x1024.jpg";
    }
 }
 
 #foreach (@links) {
 for my $nomfichier ( keys %links )
                  {
                  $urlfichier=$links{$nomfichier}; 
                  print "Tentative de téléchargement de => ".$urlfichier."\n";
                  $response = $ua->get($urlfichier);
                  if ($response->is_success) {print "\nHTTP OK";}
                  $mystream=$response->decoded_content;
                  open(FILE, ">$nomfichier.jpg") || die "Erreur E/S:$!\n";
                    print FILE $mystream;
                  close(FILE);
                  }
 
 #for my $key ( keys %links )
    #{
     #   my $value = $links{$key};
      #  print "$key => $value\n";
    #}

Et en pices jointe les deux fichiers l'un rcupr par le script, l'autre tlcharg via firefox.

Les fichiers sont sur easyshare
http://www.easy-share.com/1915363296/aprilmoon.zip


Pice jointe 77410