【问题标题】:Bash Script Loop through MySQL row and use curl and grepBash 脚本循环遍历 MySQL 行并使用 curl 和 grep
【发布时间】:2014-03-05 20:48:30
【问题描述】:

我有一个 mysql 数据库,有一个表: 网址 |单词

还有数据,例如:

------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

一个问题:

很慢:如何设置curl来优化每个网站的加载时间,不加载图片之类的?

另外,将类似的东西放在 shell 脚本中是个好主意,还是创建一个 php 脚本并使用 curl 调用它更好?

谢谢!

【问题讨论】:

  • 为什么!?你为什么要在 bash 中过滤?为什么不只是select ... where keyword like '%$keyword%'
  • 我必须获取网站内容。然后在里面搜索关键字,怎么用sql请求呢?
  • 例如:我得到 url=www.somesite.com 和keyword=ok。 curl获取网站的内容,然后我去检查关键字是否在里面。
  • 对了。完全错过了那里的 curl 电话
  • 第一个问题使用--skip-column-namesmysql

标签: mysql bash shell curl


【解决方案1】:

就目前而言,当您的示例中每行有多个关键字时,您的脚本将无法正常工作。原因是当您将hello, hi 传递给egrep 时,它会在其输入中查找确切的字符串“hello, hi”,not 查找“hello”或“hi”。您可以通过将每个关键字列表转换为带有sedegrep 兼容正则表达式来解决此问题,而无需更改数据库中的内容。您还需要从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

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2013-11-24
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多