Beginnen bij 1 en eindigt als laatste
Ik wil van een website alle links gaan spideren. Ik gebruik geen database, maar een txt bestand om bepaalde reden.
Alle landen uit die website zijn in de txt bestand gespiderd. Maar in die landenpagina staan nog meer links en die wil ik ook gaan spideren.
Met foreach krijg ik alle landen tekstbestand netjes onder elkaar. Geen probleem dus. Als ik begint met landenpagina te gaan spideren, krijg ik de laatste land gespiderd ipv 1e land. Hoe kan ik dat best oplossen?
De code:
Code (php)
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
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
function getBron($url){
$useragent = "Googlebot/2.1 (http://www.googlebot.com/bot.html)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$bestand = curl_exec($ch);
curl_close($ch);
return $bestand;
}
function getLinks($url){
//global $land;
$pagina = getBron($url);
$tag_lijst = array ();
$tag_lijst = explode(">", $pagina);
$links = array();
$regs = array();
while (list ($id, $htmlTag) = each($tag_lijst)){
if (stristr($htmlTag, "href")) {
preg_match("/(href)\s*=\s*[\'\"]?(([[a-z]{3,5}:\/\/(([.a-zA-Z0-9-])+(:[0-9]+)*))*([+:%\/\?~=&;\\\(\),._ a-zA-Z0-9-]*))(#[.a-zA-Z0-9-]*)?[\'\" ]?(\s*rel\s*=\s*[\'\"]?(nofollow)[\'\"]?)?/i", $htmlTag, $regs);
$links[] = $regs[2];
}
}
foreach ($links as $item => $value){
$fh = fopen($land.'.txt', 'a');
fwrite( $fh, sprintf("%s\r\n", $value ) );
fclose( $fh );
print_r($value);
}
}
$data = file ("landen.txt");
foreach ($data as $value) {
$land = explode ('\t\n', $value);
getLinks($land[0]);
}
$useragent = "Googlebot/2.1 (http://www.googlebot.com/bot.html)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$bestand = curl_exec($ch);
curl_close($ch);
return $bestand;
}
function getLinks($url){
//global $land;
$pagina = getBron($url);
$tag_lijst = array ();
$tag_lijst = explode(">", $pagina);
$links = array();
$regs = array();
while (list ($id, $htmlTag) = each($tag_lijst)){
if (stristr($htmlTag, "href")) {
preg_match("/(href)\s*=\s*[\'\"]?(([[a-z]{3,5}:\/\/(([.a-zA-Z0-9-])+(:[0-9]+)*))*([+:%\/\?~=&;\\\(\),._ a-zA-Z0-9-]*))(#[.a-zA-Z0-9-]*)?[\'\" ]?(\s*rel\s*=\s*[\'\"]?(nofollow)[\'\"]?)?/i", $htmlTag, $regs);
$links[] = $regs[2];
}
}
foreach ($links as $item => $value){
$fh = fopen($land.'.txt', 'a');
fwrite( $fh, sprintf("%s\r\n", $value ) );
fclose( $fh );
print_r($value);
}
}
$data = file ("landen.txt");
foreach ($data as $value) {
$land = explode ('\t\n', $value);
getLinks($land[0]);
}
Met de code ziet niks mis aan...Wie weet dus hoe ik elk land in lusje kan stoppen en begint met nieuwe wanneer de 1e klaar is..en ga zo door tot einde van de regel.
Gewijzigd op 01/01/1970 01:00:00 door Sander C
Verder haal je data van een (?) site(s), dat mag ook niet zo 1-2-3.
Ook snap ik je probleem niet echt.
Wat die Googlebot betreft...die heb ik ergens vandaan gehaald. Die moet ik nog veranderen.
En de probleem is duidelijk..ik wil de 1e link laten spideren ipv de laatste link. In de lijstje staan 160 landen.
Gewijzigd op 01/01/1970 01:00:00 door Sander C
Edit:
Wat wil je gaan doen? Alle actieve links en dode links van dat pagina eruit halen of zo?
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
Maar ik heb een textbestand met alle landen in. Als ik dat landen gaan spideren, pakt ie de laatste land ipv 1e land.
Ik moet met 1e land beginnen, alle links spideren en opslaan in textbestand met naam. Eenmaal klaar is, dan begint ie met volgend land. Het blijft herhalen tot alle landen zijn gedaan.
Dat is in dat geval niet..en dat is dus de probleem.
Ik denk dat de meeste huiverig zijn hier te helpen aangezien het een vreemd verhaal is en mogelijk illegaal. Zou je wat meer openheid van zaken kunnen geven? Welke website wil je spideren? Waarom wil je geen database gebruiken? "Gewoon alle links van de pagina eruit halen.." is erg vaag. Sorry voor het wantrouwen maar ik denk dat die antwoorden jouw verhaal een stuk duidelijker maken ;)
we hebben je antwoord nog niet gekregen maar ik heb je code even verbeterd..
Code (php)
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
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
<?php
error_reporting(E_ALL);
class spider {
function __construct($bot,$input_file,$output_file='',$output_ext='.txt') {
$this->useragent = $bot;
$this->input_f = $input_file;
$this->output_f = $output_file;
$this->output_ext = $output_ext;
$this->logs_dir = 'spider';
$this->counter = 0;
if(!file_exists('spider')) {
echo '<font color="blue">Map aangemaakt</font><br>';
mkdir("spider", 0777);
}
$this->score_out();
}
function score_out() {
if(!file_exists($this->input_f)) {
exit('<font color="red">'.htmlentities($this->input_f).' is niet aangemaakt</font>');
} else {
$word = file($this->input_f);
if(count($word)!=$this->counter) {
$this->url = $word[$this->counter];
$this->url = str_replace(PHP_EOL,'', $this->url);
$this->counter++;
if($this->get_links()) {
echo '<font color="green">'.htmlentities($this->url).' is succesvol aangemaakt en gespidert</font><br>';
$this->score_out();
} else {
echo '<font color="red">'.htmlentities($this->url).' is niet gespidert</font><br>';
$this->score_out();
}
}
}
}
function auth(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function get_links(){
preg_match('/[^.]+\.[^.]+$/', $this->url, $name);
$name = str_replace('/','_',$name[0]);
$url_afk = $this->logs_dir.'/'.$this->output_f.$name.$this->output_ext;
if(file_exists($url_afk)) {
return false;
} else {
preg_match_all('#href="(.+?)"#si',$this->auth(),$func);
foreach ($func[1] as $item => $value){
$fh = fopen($url_afk, 'a');
fwrite($fh, sprintf("%s\r\n", $value ));
fclose($fh);
}
return true;
}
}
}
$bot = "PeterBot v1";
$spider = new spider($bot,'links.txt');
?>
error_reporting(E_ALL);
class spider {
function __construct($bot,$input_file,$output_file='',$output_ext='.txt') {
$this->useragent = $bot;
$this->input_f = $input_file;
$this->output_f = $output_file;
$this->output_ext = $output_ext;
$this->logs_dir = 'spider';
$this->counter = 0;
if(!file_exists('spider')) {
echo '<font color="blue">Map aangemaakt</font><br>';
mkdir("spider", 0777);
}
$this->score_out();
}
function score_out() {
if(!file_exists($this->input_f)) {
exit('<font color="red">'.htmlentities($this->input_f).' is niet aangemaakt</font>');
} else {
$word = file($this->input_f);
if(count($word)!=$this->counter) {
$this->url = $word[$this->counter];
$this->url = str_replace(PHP_EOL,'', $this->url);
$this->counter++;
if($this->get_links()) {
echo '<font color="green">'.htmlentities($this->url).' is succesvol aangemaakt en gespidert</font><br>';
$this->score_out();
} else {
echo '<font color="red">'.htmlentities($this->url).' is niet gespidert</font><br>';
$this->score_out();
}
}
}
}
function auth(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function get_links(){
preg_match('/[^.]+\.[^.]+$/', $this->url, $name);
$name = str_replace('/','_',$name[0]);
$url_afk = $this->logs_dir.'/'.$this->output_f.$name.$this->output_ext;
if(file_exists($url_afk)) {
return false;
} else {
preg_match_all('#href="(.+?)"#si',$this->auth(),$func);
foreach ($func[1] as $item => $value){
$fh = fopen($url_afk, 'a');
fwrite($fh, sprintf("%s\r\n", $value ));
fclose($fh);
}
return true;
}
}
}
$bot = "PeterBot v1";
$spider = new spider($bot,'links.txt');
?>
links.txt
Output:
Map aangemaakt
http://www.google.nl is succesvol aangemaakt en gespidert
http://www.phphulp.nl is succesvol aangemaakt en gespidert
http://www.google.com is succesvol aangemaakt en gespidert
Nja zoals voorgaande reacties al duidelijk word, word een fake user agent van google of andere bestaande spiders tegen gegaan. Daarom waarschuw ik je ook met het gebruiken van dit.. Het gebruiken/veranderen naar een spider die reeds gebruikt word en/of foutief gebruiken is jouw verantwoordelijkheid..
Peter schreef op 17.06.2009 17:54:
Nja zoals voorgaande reacties al duidelijk word, word een fake user agent van google of andere bestaande spiders tegen gegaan. Daarom waarschuw ik je ook met het gebruiken van dit.. Het gebruiken/veranderen naar een spider die reeds gebruikt word en/of foutief gebruiken is jouw verantwoordelijkheid..
Dat wordt niet tegen gegaan hoor. Je spooft die user agent, en dat mag niet.
Na intensief overleg met de klant heeft hij toch besloten om daarvan af te zien. Al deze werk is dus voor niks geweest. Wat er verder gaat gebeuren weet ik nog niet.
Dus als er een moderator hier leest..graag hele bericht verwijderen.
berichten worden niet verwijderd, en zoveel werk was het ook weer niet (ong 10 min)