2014-03-05 56 views
0

我有一個mysql數據庫,帶有一個表: url |也就是說Bash腳本循環通過MySQL行並使用curl和grep

而像DATAS,例如:

------Column URL------- -------Column Words------ 

www.firstwebsite.com | hello, hi 

www.secondwebsite.com | someword, someotherword 

我要來遍歷表來檢查詞存在於URL所指定的網站的內容。

我有這樣的事情:

!/bin/bash 

mysql --user=USERNAME --password=PASSWORD DATABASE --skip-column-names -e "SELECT url, keyword FROM things" | while read url keyword; do 
    content=$(curl -sL $url) 
    echo $content | egrep -q $keyword 
    status=$? 

    if test $status -eq 0 ; then 
     # Found... 
    else 
     # Not found... 
    fi 
done 

一個問題:

這是非常緩慢:如何設置捲曲優化每個網頁的加載時間,不加載圖片,這樣的事情?

此外,將這樣的東西放在shell腳本中,還是創建一個php腳本並使用curl調用它是個好主意?

謝謝!

+0

爲什麼!?你爲什麼在bash中過濾?爲什麼不只是'選擇...'這樣的關鍵字像'%$ keyword%''? –

+0

我必須得到網站內容。然後在其中搜索關鍵字,那怎麼用sql請求呢? – user2178964

+0

例如:我得到url = www.somesite.com,關鍵字= ok。 curl獲取網站的內容,然後我去檢查關鍵字是否在其中。 – user2178964

回答

0

就像您的示例中那樣,您的腳本不像您所期望的那樣每行有多個關鍵字時無法正常工作。原因是,當您通過hello, hiegrep時,它將在輸入中查找確切的字符串「hello,hi」,對於「hello」或「hi」,在而不是。您可以通過將每個關鍵字列表轉換爲與sed兼容的egrep兼容的正則表達式來修正此問題,而無需更改數據庫中的內容。您還需要從mysql的輸出中刪除|,例如awk

curl在下載網頁的HTML時不檢索圖像。如果URL的查詢順序與您無關,那麼您可以通過使與&異步的整個事件加速。

#!/bin/bash 

handle_url() { 
    if curl -sL "$1" | egrep -q "$2"; then 
     echo 1 # Found... 
    else 
     echo 0 # Not found... 
    fi 
} 

mysql --user=USERNAME --password=PASSWORD DATABASE --skip-column-names -e "SELECT url, keyword FROM things" | awk -F \| '{ print $1, $2 }' | while read url keywords; do 
    keywords=$(echo $keywords | sed -e 's/, /|/g;s/^/(/;s/$/)/;') 
    handle_url "$url" "$keywords" & 
done