亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 2216 | 回復(fù): 0
打印 上一主題 下一主題

CMD與Curl雙劍合璧:自動(dòng)合并多頁(yè)主題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-11-21 15:29 |只看該作者 |倒序?yàn)g覽
CMD與Curl雙劍合璧:自動(dòng)合并多頁(yè)主題
現(xiàn)實(shí)需求
當(dāng)遇到長(zhǎng)串經(jīng)典的討論帖;
當(dāng)看到分多頁(yè)的軟件教程;
當(dāng)發(fā)現(xiàn)讓人愛(ài)不釋手的連載小說(shuō)的時(shí)候。
如何保存這些有很多分頁(yè)的內(nèi)容就成為了一件冗雜而又枯燥的機(jī)械勞動(dòng)。
無(wú)論是手工復(fù)制還是依靠軟件保存,都需要大量的人為干預(yù),這是身為智慧生物的我們所不能容忍的。
既然計(jì)算機(jī)的出現(xiàn)就是替代人進(jìn)行一些繁復(fù)的工作的,那為什么不把盡可能多的工作扔給它們呢?
可惜豆腐目前還沒(méi)有發(fā)現(xiàn)一款軟件可以滿足我的要求,既然沒(méi)有現(xiàn)成的可用那就自己動(dòng)手吧。
思路分析
要解決一個(gè)問(wèn)題必須先有一個(gè)環(huán)境,畢竟一個(gè)方案不可能通吃所有問(wèn)題。我們就先設(shè)問(wèn)題是要合并論壇中常見(jiàn)的多頁(yè)主題。
要合并一個(gè)多頁(yè)主題,我們首先得獲取這個(gè)主題的每一個(gè)分頁(yè)的內(nèi)容,這種重復(fù)性的工作讓機(jī)器來(lái)做是再適合不過(guò)的了。
其次我們需要分辨用戶貼出的內(nèi)容從哪里開(kāi)始,在哪里結(jié)束。這部分第一次需要人來(lái)完成,后面的就交給機(jī)器吧。
最后我們需要獲取我們需要的內(nèi)容并把它重新組織起來(lái)生成最終的成果,這同樣只需機(jī)器就可以很好的完成。
只要我們滿足了上面三點(diǎn),我們就可以把自己從重復(fù)勞動(dòng)中解救出來(lái)做其它的事情了。
解決方案
由于高級(jí)語(yǔ)言需要專門的學(xué)習(xí)和配套的軟件,這無(wú)形提高了應(yīng)用的難度,最終豆腐選擇了用CMD命令行來(lái)完成這個(gè)工作。
當(dāng)然,CMD命令中是沒(méi)有獲取網(wǎng)頁(yè)內(nèi)容的功能的,我們還需要
Curl
這個(gè)強(qiáng)大的命令行工具來(lái)助我們一臂之力。
我們就以合并
CCF精品技術(shù)論壇

MPlayer 2006-03-03 K&K 更新在 992 樓
為例,順著剛才的思路來(lái)一步步嘗試以達(dá)到最終的Goal。
網(wǎng)頁(yè)抓取
在Curl的幫助下,我們可以輕松的通過(guò)命令行來(lái)抓取我們想要的網(wǎng)頁(yè):
CODE:  
[Copy to clipboard]

curl -o tmp1.txt http://bbs.et8.net/bbs/showthread.php?t=634659&page=1&pp=15這樣我們就把該主題第一頁(yè)的內(nèi)容保存在了tmp1.txt文件中。
對(duì)于某些需要檢測(cè)瀏覽器信息的網(wǎng)站,我們可以用
CODE:  
[Copy to clipboard]

-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"來(lái)偽裝成IE瀏覽器。
對(duì)于需要使用cookies的網(wǎng)站,我們可以用
CODE:  
[Copy to clipboard]

-D cookie1.txt來(lái)保存cookies,用
CODE:  
[Copy to clipboard]

-b cookie1.txt來(lái)讀取cookies。
對(duì)于防盜鏈的網(wǎng)站,我們可以用
CODE:  
[Copy to clipboard]

-e "http://bbs.et8.net/"來(lái)偽裝成從某個(gè)相關(guān)聯(lián)接進(jìn)入的。 再與CMD中強(qiáng)大的 FOR 命令和變量相結(jié)合,加上人類的小小智慧,就可以打造出自動(dòng)抓取該主題的全部?jī)?nèi)容的腳本。
分析該主題的URL,我們可以知道 page= 表示頁(yè)數(shù),這為自動(dòng)化處理提供了基礎(chǔ),同時(shí)我們知道該主題有73頁(yè),最終的抓取腳本如下:
CODE:  
[Copy to clipboard]

@echo off
setlocal ENABLEDELAYEDEXPANSION
set last=1
for /l %%i in (1,1,73) do (
echo %%i
curl -b cookie!last!.txt -D cookie%%i.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "http://bbs.et8.net/bbs/showthread.php?t=634659^&page=!last!^&pp=15" -o tmp%%i.txt http://bbs.et8.net/bbs/showthread.php?t=634659^&page=%%i^&pp=15
set /a last=%%i-1
)
copy tmp*.txt temp.txt
del cookie*.txt
del tmp*.txt
endlocal將上面腳本保存為 grab.cmd 運(yùn)行后我們就的到了保存了該主題全部73頁(yè)內(nèi)容的 temp.txt 文件。
內(nèi)容分析
由于CMD字符處理的問(wèn)題,我們先把 temp.txt 另存為 ANSI 編碼。
分析單頁(yè)的內(nèi)容后豆腐發(fā)現(xiàn)該論壇程序在用戶內(nèi)容開(kāi)始之前有一個(gè)每頁(yè)唯一的 ,
而在結(jié)束的時(shí)候有一個(gè)同樣唯一的  ,這正是我們所希望找到的可以作為標(biāo)志位的地方。
文本處理
由于 FOR 命令一次只能以同樣的規(guī)則處理一行的內(nèi)容,于是豆腐便采用 FOR 嵌套的方式來(lái)處理整個(gè)大文件。
先用
CODE:  
[Copy to clipboard]

for /f "delims=" %%i in (temp.txt) do ( echo %%i >tmp.txt )將 temp.txt 的內(nèi)容一次一行地寫(xiě)入 tmp.txt。
再套用另一個(gè) FOR 來(lái)處理 tmp.txt 的一行。
標(biāo)志設(shè)置
我們可以通過(guò) FOR 的 delims= 和 tokens= 參數(shù)來(lái)分割和保存一行的內(nèi)容
我們用
CODE:  
[Copy to clipboard]

for /f "tokens=1-3 delims== " %%j in (tmp.txt)參數(shù)設(shè)定以 ""、"-"、"="、" "來(lái)分割一行,
并把分割后的前三段內(nèi)容存入 %%j %%k %%l 三個(gè)變量中。接著我們用 if 語(yǔ)句來(lái)判斷這三個(gè)變量是否符合設(shè)置標(biāo)志位的條件:
CODE:  
[Copy to clipboard]

if "%%j"=="div" if "%%k"=="id" if %%l=="posts" set flag=1
if "%%j"=="start" if "%%k"=="content" if "%%l"=="table" set flag=0flag=1 代表用戶內(nèi)容開(kāi)始,flag=0代表用戶內(nèi)容結(jié)束。
內(nèi)容剪裁
由于CMD命令行處理的限制,HTML中的注釋開(kāi)始符號(hào) "CODE:  
[Copy to clipboard]

for /f "tokens=1-8 delims=" if not "%%s"=="-->" if not "%%r"=="-->" if not "%%q"=="-->" if not "%%p"=="-->" if not "%%o"=="-->" if not "%%m"=="ECHO" if !flag!==1 echo %%i >>new.htm)同時(shí),我們也完成了把開(kāi)始標(biāo)志位后的內(nèi)容存入 new.htm 的工作。
最終腳本
CODE:  
[Copy to clipboard]

@echo off
setlocal ENABLEDELAYEDEXPANSION
set flag=0
for /f "delims=" %%i in (temp.txt) do (
echo %%i >tmp.txt
for /f "tokens=1-3 delims== " %%j in (tmp.txt) do (
if "%%j"=="div" if "%%k"=="id" if %%l=="posts" set flag=1
if "%%j"=="start" if "%%k"=="content" if "%%l"=="table" set flag=0
for /f "tokens=1-8 delims=" if not "%%s"=="-->" if not "%%r"=="-->" if not "%%q"=="-->" if not "%%p"=="-->" if not "%%o"=="-->" if not "%%m"=="ECHO" if !flag!==1 echo %%i >>new.htm
)
)
)
del tmp.txt
endlocal保存腳本為 merge.cmd 運(yùn)行后得到合并出的 new.htm 文件就是該主題全部1083帖的內(nèi)容。
優(yōu)化改進(jìn)
該腳本只完成了抓取文本內(nèi)容的工作,我們還可以通過(guò)判斷 IMG 元素來(lái)找到圖片內(nèi)容,
并把 src 屬性后面的路徑補(bǔ)完成完整路徑,就可以正確顯示出內(nèi)容中的圖片。
后記總結(jié)
CMD和Curl相結(jié)合可以完成很多批量的復(fù)雜工作,雖然第一次多花點(diǎn)時(shí)間,但之后就可以方便的使用了。
該腳本可以順利抓取合并CCF精品技術(shù)論壇的任意主題以及部分基于vBulletin的論壇,但對(duì)于其它論壇還需要分別修改才可使用。


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/11065/showart_2100029.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP