您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“php的Snoopy類如何使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“php的Snoopy類如何使用”吧!
php的Snoopy類
獲取請(qǐng)求網(wǎng)頁(yè)里面的所有鏈接,直接使用fetchlinks就可以,獲取所有文本信息使用fetchtext(其內(nèi)部還是使用正則表達(dá)式在進(jìn)行處理),還有其它較多的功能,如模擬提交表單等。
使用方法:
1、先下載Snoopy類
2、先實(shí)例化一個(gè)對(duì)象,然后調(diào)用相應(yīng)的方法即可獲取抓取的網(wǎng)頁(yè)信息
示例:
include "snoopy/Snoopy.class.php"; $snoopy = new Snoopy(); $sourceURL = "http://xxxxxxxxx"; $snoopy->fetchlinks($sourceURL); $a = $snoopy->results;
它并沒有提供獲取網(wǎng)頁(yè)中所有圖片地址的方法,自己有個(gè)需求是要獲取一個(gè)頁(yè)面中所有文章列表中圖片地址。然后自己就寫了一個(gè),主要還是正則那里匹配重要。
//匹配圖片的正則表達(dá)式 $reTag = "/<img[^s]+src="(http://[^"]+).(jpg|png|gif|jpeg)"[^/]*/>/i";
因?yàn)樾枨蟊容^特殊,只需要抓取寫死htp://開頭的圖片(外站的圖片可能使得了防盜鏈,想先抓取到本地)
實(shí)現(xiàn)思路:
1、抓取指定網(wǎng)頁(yè),并篩選出預(yù)期的所有文章地址;
2、循環(huán)抓取第一步中的文章地址,然后使用匹配圖片的正則表達(dá)式進(jìn)行匹配,獲取頁(yè)面中所有符合規(guī)則的圖片地址;
3、根據(jù)圖片后綴和ID(這里只有g(shù)if、jpg)保存圖片---如果此圖片文件存在,先將其刪除再保存
<meta http-equiv="content-type" content="text/html;charset=utf-8"> <?php include "snoopy/Snoopy.class.php"; $snoopy = new Snoopy(); $sourceURL = "http://xxxxx"; $snoopy->fetchlinks($sourceURL); $a = $snoopy->results; $re = "/d+.html$/"; //過(guò)濾獲取指定的文件地址請(qǐng)求 foreach ($a as $tmp) { if (preg_match($re, $tmp)) { getImgURL($tmp); } } function getImgURL($siteName) { $snoopy = new Snoopy(); $snoopy->fetch($siteName); $fileContent = $snoopy->results; //匹配圖片的正則表達(dá)式 $reTag = "/<img[^s]+src="(http://[^"]+).(jpg|png|gif|jpeg)"[^/]*/>/i"; if (preg_match($reTag, $fileContent)) { $ret = preg_match_all($reTag, $fileContent, $matchResult); for ($i = 0, $len = count($matchResult[1]); $i < $len; ++$i) { saveImgURL($matchResult[1][$i], $matchResult[2][$i]); } } } function saveImgURL($name, $suffix) { $url = $name.".".$suffix; echo "請(qǐng)求的圖片地址:".$url."<br/>"; $imgSavePath = "E:/xxx/style/images/"; $imgId = preg_replace("/^.+/(d+)$/", "1", $name); if ($suffix == "gif") { $imgSavePath .= "emotion"; } else { $imgSavePath .= "topic"; } $imgSavePath .= ("/".$imgId.".".$suffix); if (is_file($imgSavePath)) { unlink($imgSavePath); echo "<p style="color:#f00;">文件".$imgSavePath."已存在,將被刪除</p>"; } $imgFile = file_get_contents($url); $flag = file_put_contents($imgSavePath, $imgFile); if ($flag) { echo "<p>文件".$imgSavePath."保存成功</p>"; } } ?>
在使用php抓取網(wǎng)頁(yè):內(nèi)容、圖片、鏈接的時(shí)候,我覺得最重要的還是正則(根據(jù)抓取的內(nèi)容和指定的規(guī)則獲取想要的數(shù)據(jù)),思路其實(shí)都比較簡(jiǎn)單,用到的方法也并不多,也就那幾個(gè)(而且抓取內(nèi)容還是直接調(diào)用別人寫好的類中的方法就可以了)
但之前想過(guò)的是php似乎并沒有實(shí)現(xiàn)如下的方法,比如一個(gè)文件中有N行(N很大),需要將其中符合規(guī)則的行內(nèi)容進(jìn)行替換,如第3行是aaa需要轉(zhuǎn)成bbbbb。一般的需要修改文件時(shí)的常見做法:
1、一次讀取整個(gè)文件(或是逐行讀?。?,然后使用臨時(shí)文件進(jìn)行保存最終轉(zhuǎn)換后的結(jié)果,再替換原始文件
2、逐行讀取,使用fseek控制文件指針的位置,然后fwrite寫入
方案1在文件較大時(shí),一次讀取不可?。ㄖ鹦凶x取,然后寫入臨時(shí)文件再替換原始文件效率感覺也不高),方案2則在被替換的字符串長(zhǎng)度小于等于目標(biāo)值時(shí)沒問(wèn)題,但超過(guò)了則會(huì)有問(wèn)題,它會(huì)“越界”,將下一行的數(shù)據(jù)也打亂了(不能像JavaScript中有“選區(qū)”的概念,使用新的內(nèi)容進(jìn)行替換)
下面是使用方案2做試驗(yàn)的代碼:
<?php $mode = "r+"; $filename = "d:/file.txt"; $fp = fopen($filename, $mode); if ($fp) { $i = 1; while (!feof($fp)) { $str = fgets($fp); echo $str; if ($i == 1) { $len = strlen($str); fseek($fp, -$len, SEEK_CUR);//指針向前移動(dòng) fwrite($fp, "123"); } $i++; } fclose($fp); } ?>
先讀取一行,此時(shí)文件指針其實(shí)是指到下一行開頭,使用fseek將文件指針回移到上一行起始位置,然后使用fwrite進(jìn)行替換操作,正因?yàn)槭翘鎿Q操作,在不指定長(zhǎng)度的情況下,它把影響到下一行的數(shù)據(jù),而我想要的是只想針對(duì)這一行進(jìn)行操作,例如刪除這一行或是整行只替換為一個(gè)1。
到此,相信大家對(duì)“php的Snoopy類如何使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。