Jadual Kandungan
回复讨论(解决方案)
Rumah pembangunan bahagian belakang tutorial php 正则抓取天涯数据,递归失败,求解。。。。

正则抓取天涯数据,递归失败,求解。。。。

Jun 23, 2016 pm 02:19 PM

本帖最后由 liuser_cn 于 2013-08-12 21:25:48 编辑

前言:我的面向对象基础一般。。

我是抓的一个模块(鬼话)。
它的下一页是用时间戳来搞的。
我就想,在抓取第一页的所有标题URL之后,顺便抓取下一页的地址(‘可以抓取’);
现在是,第一页的所有标题的URL抓完了,下一页的URL也抓了,
我想递归100次,抓100页的所有标题的URL。
看代码吧。
   public function getAllPage($url){        /**         * curl_setopt($ch, CURLOPT_FAILONERROR, true);//记录错误信息设置         * curl_errno可以获得错误码,当然也包括错误的http状态码           curl_error可以获得错误信息         */        $ch =  curl_init($url);//初始化一个句柄        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);        curl_setopt($ch,CURLOPT_TIMEOUT,1111111);        $html = curl_exec($ch);        curl_close($ch);                //修饰一下,从何时开始。        $length     = strpos($html, 'class="mt5');        $newHtml    = substr($html, $length);        //修饰END            $pattern    = "#\/post-.*\.shtml#i"; //正则表达式            preg_match_all($pattern, $newHtml,$matches);            //抓取下一页链接地址            $nextPagePattern   =    "#\<a href=\"(.*)\"\srel#";            preg_match($nextPagePattern, $newHtml,$nextPage);            $nextPageUrl    =   "http://bbs.tianya.cn".$nextPage['1'];            //下一页   END            //链接。全。            foreach($matches['0'] as $k=>$v){                 $matches[$k]   =   'http://bbs.tianya.cn'.$v;            }            //之前的递归是在这里的,一运行直接死掉了。。。。。        return array(            '0'=>$matches,            '1'=>$nextPageUrl,        );    }
Salin selepas log masuk


我想问一下,这个思路有没有问题?
递归的代码方便给一个么= =!!


回复讨论(解决方案)

foreach($ matches['0'] as $k=>$v){
$matches[$k] = 'http://bbs.tianya.cn'.$v;
}

循环中修改数组的意义是什么呢?
你的递归部分的代码也贴出来

foreach($ matches['0'] as $k=>$v){
$matches[$k] = 'http://bbs.tianya.cn'.$v;
}

循环中修改数组的意义是什么呢?
你的递归部分的代码也贴出来
1:补全,抓取到的地址没有域名。
2:递归。。。我那个注释之前是这样写的,

for($i=0;$i<100;$i++){  $this->getAllPage($nextPageUrl)             }
Salin selepas log masuk

for($i=0;$i   $this->getAllPage($nextPageUrl)
}

这么做并不是递归抓取100次。
而是循环了一百次,每次都在执行一个递归函数,而你的递归函数是没有出口的(没有跳出递归的出口,会导致无限递归),当然会死了。

for($i=0;$i   $this->getAllPage($nextPageUrl)
}

这么做并不是递归抓取100次。
而是循环了一百次,每次都在执行一个递归函数,而你的递归函数是没有出口的(没有跳出递归的出口,会导致无限递归),当然会死了。
请赐教?

for($i=0;$i   $this->getAllPage($nextPageUrl)
}

这么做并不是递归抓取100次。
而是循环了一百次,每次都在执行一个递归函数,而你的递归函数是没有出口的(没有跳出递归的出口,会导致无限递归),当然会死了。
出口就是判断么?

对你的需求,可以这么做:
public function getAllPage($url, $depth, &$result)
$depth控制递归的深度,初始为0。 引用型的$result 记录最终的匹配到的结果。

递归的跳出部分:
if($depth == 100){
    return;
}

递归函数的递归部分:
    $nextPageUrl    =   "http://bbs.tianya.cn".$nextPage['1'];
    foreach($matches['0'] as $k=>$v){
        $result[] = 'http://bbs.tianya.cn'.$v;
    }
    getAllPage($nextPageUrl,$depth+1,$result);


递归函数初始调用:
$result = array();
getAllPage($url,0,$result);


for($i=0;$i   $this->getAllPage($nextPageUrl)
}

这么做并不是递归抓取100次。
而是循环了一百次,每次都在执行一个递归函数,而你的递归函数是没有出口的(没有跳出递归的出口,会导致无限递归),当然会死了。
出口就是判断么?

还真不是。你即使去掉循环,只用getAllPage(...)那一部分,也会死的。

对你的需求,可以这么做:
public function getAllPage($url, $depth, &$result)
$depth控制递归的深度,初始为0。 引用型的$result 记录最终的匹配到的结果。

递归的跳出部分:
if($depth == 100){
    return;
}

递归函数的递归部分:
    $nextPageUrl    =   "http://bbs.tianya.cn".$nextPage['1'];
    foreach($matches['0'] as $k=>$v){
        $result[] = 'http://bbs.tianya.cn'.$v;
    }
    getAllPage($nextPageUrl,$depth+1,$result);


递归函数初始调用:
$result = array();
getAllPage($url,0,$result);
多谢!!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pembalakan PHP: Amalan Terbaik untuk Analisis Log PHP Pembalakan PHP: Amalan Terbaik untuk Analisis Log PHP Mar 10, 2025 pm 02:32 PM

Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Bekerja dengan Data Sesi Flash di Laravel Bekerja dengan Data Sesi Flash di Laravel Mar 12, 2025 pm 05:08 PM

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Curl dalam PHP: Cara Menggunakan Pelanjutan PHP Curl dalam API REST Mar 14, 2025 am 11:42 AM

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Respons HTTP yang dipermudahkan dalam ujian Laravel Respons HTTP yang dipermudahkan dalam ujian Laravel Mar 12, 2025 pm 05:09 PM

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 skrip sembang php terbaik di codecanyon 12 skrip sembang php terbaik di codecanyon Mar 13, 2025 pm 12:08 PM

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Terangkan konsep pengikatan statik lewat dalam PHP. Terangkan konsep pengikatan statik lewat dalam PHP. Mar 21, 2025 pm 01:33 PM

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Menyesuaikan/Memperluas Rangka Kerja: Cara Menambah Fungsi Custom. Mar 28, 2025 pm 05:12 PM

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.

See all articles