標籤:user gets class art gen mod com 自己 完整
1.問題描寫敘述
實現對固定網頁上自己須要的資訊抓取,以表格形式儲存。
我是拿wustoj上的一個熱門排行榜來練習的,地址:wustoj
2.思路
網頁自己就簡單學習了一下php,剛好用它來做點事情吧,我的想法是這種:
(1)查看網頁源碼並儲存在檔案裡。
(2)依據須要的資訊寫出正則表達式。讀檔案,依據正則表達式來提取須要的資訊。寫正則表達式的時候最好分組,這樣提取起來就方便了非常多。
(3)對excel操作。將提取的資訊以excel的形式輸出。
比較好的開源php處理excel類連結:點擊開啟連結
3.體會
^是指要是原字串的開頭。$是指要是原字串的結尾。
Null 字元不一定是空格。
用()來分組是好方法,如preg_macth_all(/$pattern/,$subject,matches)。
matches為二維數組,假設沒有_all。則僅僅會匹配第一部分,是一維數組。
$matches[0]儲存完整模式的全部匹配。$matches[1]儲存第一子組全部匹配,即全部匹配的第一部分。
中文匹配串我用的這個$patt_ch=chr(0x80)."-".chr(0xff)。
4.代碼
<?phpheader("Content-Type: text/html; charset=utf-8");$url = "http://acm.wust.edu.cn/contestrank.php?cid=1014";$result=file_get_contents($url);$file=fopen("content.php","w");fwrite($file,$result);$file=fopen("content.php","r");$patt_ch=chr(0x80)."-".chr(0xff);// <td>1<td$rankpatt="(<td>)([0-9]+|\*)(<td)"; // part2//<a href=status.php?user_id=team30&cid=1014>team30_姓名</a>$namepatt="(<a[[:space:]]href=status\.php\?user_id=team[0-9]+&cid=1014>)(\*{0,1}team[0-9]+)(_)([$patt_ch]+)(<\/a>)"; // part2 part4//$namepatt="(team[0-9]+)(_)([$patt_ch]+)"; 也能夠用這個直接匹配"team_姓名"//<a href=status.php?user_id=team30&cid=1014&jresult=4>7</a>$problempatt="(<a[[:space:]]href=status\.php\?user_id=team[0-9]+&cid=1014&jresult=4>)([0-9]+)(<\/a>)";//Include classrequire_once(‘Classes/PHPExcel.php‘);require_once(‘Classes/PHPExcel/Writer/Excel2007.php‘);$objPHPExcel = new PHPExcel();//Set properties 設定檔案屬性$objPHPExcel->getProperties()->setCreator("Maarten Balliauw");$objPHPExcel->getProperties()->setLastModifiedBy("Maarten Balliauw");$objPHPExcel->getProperties()->setTitle("Office 2007 XLSX Test Document");$objPHPExcel->getProperties()->setSubject("Office 2007 XLSX Test Document");$objPHPExcel->getProperties()->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.");$objPHPExcel->getProperties()->setKeywords("office 2007 openxml php");$objPHPExcel->getProperties()->setCategory("Test result file");$row=1;$objPHPExcel->getActiveSheet()->setCellValue(‘A‘.$row, ‘rank‘);$objPHPExcel->getActiveSheet()->setCellValue(‘B‘.$row, ‘team‘);$objPHPExcel->getActiveSheet()->setCellValue(‘C‘.$row, ‘solved‘);while(!feof($file)){//echo $row." ";$line=fgets($file);if(preg_match("/$rankpatt/",$line,$match)){$row++;//print_r($match);//echo$match[2]." ";//echo"<br>";$objPHPExcel->getActiveSheet()->setCellValue(‘A‘.$row, $match[2]);$objPHPExcel->getActiveSheet()->getStyle(‘A‘.$row)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);}if(preg_match("/$namepatt/",$line,$match)){//print_r($match);//echo$match[2]." ".$match[4]." ";//echo"<br>"; $objPHPExcel->getActiveSheet()->setCellValue(‘B‘.$row, $match[2].$match[4]);}if(preg_match("/$problempatt/",$line,$match)){//print_r($match);//echo$match[2]." ";//echo"<br>";$objPHPExcel->getActiveSheet()->setCellValue(‘C‘ . $row, $match[2]);$objPHPExcel->getActiveSheet()->getStyle(‘C‘.$row)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);}$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);$objWriter->save(str_replace(‘.php‘, ‘.xlsx‘, __FILE__));}echo"well done:)";?>
5.執行結果
網頁抓取資訊(php正則表達式、php操作excel)