萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php利用file_get_contents批量采集網站內容

php利用file_get_contents批量采集網站內容

file_get_contents函數是一個可以讀取本地與遠程服務器文件的函數了,下面我們就來介紹利用file_get_contents做一個小的采集功能。 最近發現了一個“小氣”的學習站點。網站內容竟然不讓復制,這樣搞,怎麼讓我們考試的時候弄小抄,難不成要一個字一個字的去打不成。所幸的是咱是搞技術的,這點問題還是難不倒的,你不讓復制剛好,這下我還懶得麻煩呢。直接搞個腳本把這一課的內容全扒取下來看豈不更方便。 說搞就搞,先是看源代碼。不過網頁禁止了右鍵,點右鍵有如下提示:

php利用file_get_contents批量采集網站內容

這個倒不難,查看網頁源代碼的方法太多了,不知道的可以網上找找吧。查看到了,源代碼,發現沒找頁面中的內容未在源代碼中顯示。接著拿出httpwatch抓包分析,在其中的另外一個鏈接裡找到頁面源代碼,不過源代碼是加密過的。如下:

php利用file_get_contents批量采集網站內容 不過這個加密有點菜,裡面已經明明白的寫著是base64加密了。這個解碼並不難,linux系統自帶的base64工具就能完成:
[root@web20 php]# base64 --helpUsage: base64 [OPTION] [FILE]Base64 encode or decode FILE, or standard input, to standard output.-w, --wrap=COLS       Wrap encoded lines after COLS character (default 76).Use 0 to disable line wrapping.-d, --decode          Decode data.-i, --ignore-garbage  When decoding, ignore non-alphabet characters.--help            Display this help and exit.--version         Output version information and exit.如果[文件]缺省,或者[文件]為 - ,則讀取標准輸入。The data are encoded as described for the base64 alphabet in RFC 3548.Decoding require compliant input by default, use --ignore-garbage to
attempt to recover from non-alphabet characters (such as newlines) in
the encoded stream.
base64 -d 文件名就行了。不過解碼後發現,解出的結果是url化的。得到的結果如下:
%20%20%5B%E8%AF%86%E8%AE%B0%5D%E4%BC%9A%E8%AE%A1%E7%9A%84%E6%B6%B5%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88%EF%20%20
看到這個結果是不是又犯難了,其時這個時候應該感到高興才是。因為結果已經出來一半了。這個得出的結果不正是和在url裡進行漢字搜索得到的的URL結果一樣嗎? 如:我在hao123的百度搜索裡找"測試",得到的頁面url是
http://www.baidu.com/s?word=%B2%E2%CA%D4&tn=sitehao123
測試兩個漢字在url中就變成了%B2%E2%CA%D4 ,知道原理了。解碼還不是很簡單。php中有個函數urldecode就是干這個用的。下面列出來我全部的url代碼:
<?php
for ($i=18291; $i<=18788 ;$i++ ){
$content = file_get_contents("http://www.XXX.com/test.php?wiki_id=".$i);//echo $content;
$spwt1=explode("問題:",$content);
$spwt2=explode('));<',$spwt1[1]);
$spdn=explode("答案:",$spwt2[1]);//echo $spwt2[0];//echo $spdn[1];
preg_match('/base64decode("(.*?)"/',$spwt2[0],$matchesw);
$wen=urldecode(base64_decode($matchesw[1]));
echo $wen;
echo "n";
echo "n";
preg_match('/base64decode("(.*?)"/',$spdn[1],$matchesd);
$da=urldecode(base64_decode($matchesd[1]));
echo $da;}?>
此外為了我出於對那個站點的知識產權的保護,把他的URL給換成了http://www.XXX.com/test.php 。(畢竟人家也是一點點做上去的也不容易。)剛好我服務器上也有php環境,直接運行php test.php。結果非常喜人,一會兒功夫,這一課目的內容全出來了。
copyright © 萬盛學電腦網 all rights reserved