2014-03-05 57 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