0

此代码搜索网站 html 文件并提取域名列表...

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | grep -iEo '[[:alnum:]-]+\.(com|net|org)'

结果看起来像这样。

  • domain1.com
  • domain2.com
  • domain3.com

我计划在非常大的网站上使用此代码,因此这将生成非常大的域名列表。另外,上面的代码会产生很多重复的域名。因此,我设置了一个具有唯一字段的 mysql 数据库,因此不会插入重复项。

使用我有限的编程知识,我将下面的这一行代码拼凑在一起,但这不起作用。当我执行命令时,我没有收到任何错误,只有一个新的命令提示符 > 和一个闪烁的光标。我假设我没有使用正确的语法或方法,和/或我想做的事情可能无法通过命令行。任何帮助深表感谢。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" | domain=“$(grep -iEo '[[:alnum:]-]+\.(com|net|org)’)” | mysql -pPASSWORD -e "INSERT INTO domains.domains (domains) VALUES ($domain)”

是的,我的数据库名称是域,我的表名称是域,我的字段名称是域。

4

1 回答 1

0

从 MySQL 的INSERT语法来看:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name,…)] 
    [(col_name,…)]
    {VALUES | VALUE} ({expr | DEFAULT},…),(…),…
    …

您需要将域名转换为带括号、引号、逗号分隔的项目:

('domain1.com'),('domain2.com'),…

然后将此列表附加到您生成的 INSERT 语句的末尾。

httrack --skeleton http://www.ilovefreestuff.com -V "cat \$0" |
grep -iEo '[[:alnum:]-]+\.(com|net|org)’ |
sort -u |
sed -e "s/.*/,('&')/" -e '1s/,/INSERT IGNORE INTO domains.domains(domain) VALUES /' |
mysql -pPASSWORD

sort -u确保名称是唯一的。第一个-esed一行的内容(例如domain1.com)转换为,('domain1.com); 第二个-e删除第一行的逗号(由第一行添加)并用前缀-e替换它。in语句表示如果域已经在表中,则新条目将被忽略INSERTIGNOREINSERT

显然,如果生成的域数量对于 MySQL 中的有效 SQL 语句来说太大,您将不得不对数据进行一些拆分,但您可能一次能够处理几千个域。

于 2014-05-25T18:02:56.483 回答