一個(gè)簡(jiǎn)單的開(kāi)源PHP爬蟲(chóng)框架『Phpfetcher』
優(yōu)采云 發(fā)布時(shí)間: 2020-05-27 08:02報dom為空
fanfank 文章作者
完整的代碼貼下來(lái)我看一下,或者在微博私信我,我幫你看一下
aa
//下面兩行促使這個(gè)項目被下載出來(lái)后本文件能直接運行
$demo_include_path = dirname(__FILE__) . ‘/../’;
set_include_path(get_include_path() . PATH_SEPARATOR . $demo_include_path);
require_once(‘phpfetcher.php’);
class mycrawler extends Phpfetcher_Crawler_Default {
public function handlePage($page) {
var_dump($page);
//打印處當前頁(yè)面的第1個(gè)h1標題內榮(下標從0開(kāi)始)
$strFirstH1 = trim($page->sel(‘//title’, 0)->plaintext);
if (!empty($strFirstH1)) {
echo $page->sel(‘//title’, 0)->plaintext;
echo “\n”;
}
}
}
$crawler = new mycrawler();
$arrJobs = array(
//任務(wù)的名子隨意起,這里把名子叫qqnews
//the key is the name of a job, here names it qqnews
‘qqnews’ => array(
‘start_page’ => ‘#8217;, //起始網(wǎng)頁(yè)
‘link_rules’ => array(
/*
* 所有在這里列舉的正則規則,只要能匹配到超鏈接,那么那條爬蟲(chóng)才會(huì )爬到那條超鏈接
* Regex rules are listed here, the crawler will follow any hyperlinks once the regex matches
*/
//’#news\.qq\.com/a/\d+/\d+\.htm$#’,
),
//爬蟲(chóng)從開(kāi)始頁(yè)面算起,最多爬取的深度,設置為2表示爬取深度為1
//Crawler’s max following depth, 1 stands for only crawl the start page
‘max_depth’ => 1,
) ,
);
$crawler->setFetchJobs($arrJobs)->run(); //這一行的療效和下邊兩行的療效一樣
其他的沒(méi)變
aa
public function read() {
$this->_strContent = curl_exec($this->_curlHandle);
是_strContent取到了false造成的 這個(gè)是啥緣由呢Page default.php
fanfank 文章作者
我這兒返回的是403 forbidden,查了一下曉得緣由了,因為user_agent的問(wèn)題csdn把爬蟲(chóng)給禁了。你可以這樣更改:找到文件Phpfetcher/Page/Default.php,然后搜『user_agent』,把上面改掉,我改成『firefox』就可以了,當然你可以可以改得更真實(shí)一點(diǎn),例如哪些『Mozilla/5.0 AppleWebKit』之類(lèi)的
有些網(wǎng)站會(huì )依照UA來(lái)屏蔽懇求,可能是因為個(gè)別UA有惡意功擊的特點(diǎn),或者一些爬蟲(chóng)之類(lèi)的開(kāi)源爬蟲(chóng)框架,之前百度有一段時(shí)間屏蔽360瀏覽器就是通過(guò)360瀏覽器里一些特定的UA來(lái)做到的,當然后來(lái)360瀏覽器把UA給更改嗯,就須要依照其它特點(diǎn)屏蔽了。
所以你這兒先改一下user_agent吧。
aa
多謝哈
試著(zhù)改成Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0 也不行呢
試了這兒的也不行 恐怕還是curl的問(wèn)題
fanfank 文章作者
我這兒執行都是正常的,結果也能下來(lái)。還是通過(guò)微博私信說(shuō)吧,這里說(shuō)得刷屏了
aa
圍脖id是?
fanfank 文章作者
另外是,你貼的代碼上面,標點(diǎn)符號不對啊,你的start_page對應那一行的標點(diǎn),怎么是英文的單冒號?后面的單冒號似乎也不是個(gè)單冒號吧?要全部用英語(yǔ)的單冒號才行。
aa
符號是對的哈 都是英語(yǔ)的 沒(méi)句型錯誤
joke
為什么匹配的內容都一樣?
代碼:
sel(‘//span[@id=”text110″]’, 0)->plaintext);
if (!empty($strFirstH1)) {
echo “”;
echo $page->sel(‘//span[@id=”text110″]’, 0)->plaintext;
echo “”;
echo “\n”;
}
}
}
$crawler = new mycrawler();
$arrJobs = array(
‘joke’ => array(
‘start_page’ => ‘#8217;,
‘link_rules’ => array(
‘#/\woke\wtml/\w+/20151021\d+\.htm$#’,
),
‘max_depth’ => 2,
) ,
);
$crawler->setFetchJobs($arrJobs)->run();
fanfank 文章作者
你的代碼沒(méi)貼全,而且匹配的內容都一樣我沒(méi)很理解是哪些意思,這個(gè)問(wèn)題有點(diǎn)長(cháng),你直接在微博私信我,我幫你看一下
fanfank 文章作者
已經(jīng)修補了。之前的問(wèn)題是爬蟲(chóng)不認識站內鏈接,例如有的超鏈接是『/entry』這樣的,而不是『』?,F在最新的Phpfetcher早已就能辨識站內鏈接,可以試一下
joke
謝謝 ,搞定了
modejun
樓主您好,問(wèn)問(wèn)假如我曉得了一個(gè)網(wǎng)站開(kāi)源爬蟲(chóng)框架,但是要遞交post參數,這個(gè)要如何弄呢,朋友提供一下思路
fanfank 文章作者
提交post參數,那覺(jué)得場(chǎng)景很特殊的,因為這個(gè)就不是單純地按照鏈接爬取網(wǎng)頁(yè)內容了,而且假如真的提供這個(gè)功能,針對什么樣的鏈接什么樣的參數,怎么遞交,然后返回的內容是如何處理這種,目前我覺(jué)得似乎不太適宜爬蟲(chóng)做?;蛘吣阍谖⒉┧叫盼?,告訴我你的使用場(chǎng)景是哪些,我瞧瞧是不是考慮找時(shí)間加進(jìn)去
modejun
場(chǎng)景就是有一翻頁(yè)時(shí)用ajax post遞交的page參數,如果是get就太easy。還有順便問(wèn)問(wèn),如果翻頁(yè)我明天試了要解決的話(huà)就是調節深度,但是似乎最大是20,還有就是更改正則循環(huán)調用setFetchJobs這個(gè)方式,總是覺(jué)得不是這么完美,有哪些好的思路解決翻頁(yè)這個(gè)問(wèn)題嗎,現在公司在定方案我想多了解把這個(gè)框架的優(yōu)勢發(fā)揮下來(lái),感謝了。
fanfank 文章作者
如果像你說(shuō)的是個(gè)post懇求,那么它返回的應當不是一個(gè)HTML格式的文檔,通常都是json格式的,然后由當前頁(yè)面將異步返回的內容加載顯示下來(lái)。
你們的post懇求應當是有類(lèi)似pn,rn等參數,如果大家僅僅是想領(lǐng)到post懇求的所有內容,可以直接寫(xiě)一個(gè)for循環(huán),然后使用php的curl來(lái)直接發(fā)送post懇求獲取每一個(gè)頁(yè)面內容,可以不使用爬蟲(chóng),因為這個(gè)爬蟲(chóng)基本原理是針對GET懇求返回的HTML頁(yè)面的,然后手動(dòng)抽取HTML的標簽
最大深度可以更改類(lèi)『Phpfetcher_Crawler_Default』中的『MAX_DEPTH』變量,把20改成-1就沒(méi)有限制了,不過(guò)建議還是設一個(gè)上限比較好
可以不需要循環(huán)更改正則呀,設置正則規則的可以是一個(gè)鏈表,把上面的所有你認為合適的正則都列上就可以,除非說(shuō)你的正則表達式還得依據頁(yè)面的某個(gè)參數或則內容不同而更改,那這個(gè)情況還是相對特殊了一點(diǎn)···
翻頁(yè)的解決,如果是GET就用爬蟲(chóng),如果是POST,那么直接for循環(huán)之后調用curl會(huì )更好。
??;;;
好像不錯
??;;;
能不能寫(xiě)個(gè)DOM選擇器和技巧的文檔,最好支持css選擇DOM標簽,有子節點(diǎn),父節點(diǎn),兄弟節點(diǎn)選擇才好
fanfank 文章作者
在這個(gè)項目的github頁(yè)面:,中文說(shuō)明的第2節上面,有介紹dom選擇器的文檔
jeremy
博主。。為什么https的頁(yè)面沒(méi)辦法懇求呢?



