在文件的每一行上运行curl命令并从结果中获取数据。

12

假设我有一个包含网页链接列表的文件。

www.xyz.com/asdd
www.wer.com/asdas
www.asdas.com/asd
www.asd.com/asdas

我知道执行curl www.xyz.com/asdd将获取该网页的HTML。我想从该网页中获取一些数据。

所以场景是使用curl依次点击文件中的所有链接,并从网页中提取一些数据并存储在其他地方。有任何想法或建议吗?


3
你熟悉while read line; do curl "$line"; done < your_file这个命令吗? 它会循环读取每一行并对每一行运行curl命令。关于其他要求,你的意思不是很清楚。 - fedorqui
使用curl命令访问文件中的所有链接,您需要先解析该文件。 - user557597
@fedorqui 在每行代码执行后,我想使用正则表达式提取页面的标题。 - aelor
1
这有点另外一个问题了。你尝试过什么? - fedorqui
1
ooo @fedorqui,你的命令对我很有帮助,非常感谢。请将其作为答案添加,我会接受的。 - aelor
2个回答

14

正如评论所指出的那样,这将循环遍历your_file并对每一行进行curl操作:

while IFS= read -r line
do
   curl "$line"
done < your_file

要获取页面的<title>,可以使用类似以下命令的 grep

grep "<title>" file.html
grep -iPo '(?<=<title>).*(?=</title>)' file

所以总的来说,你可以这样做

while IFS= read -r line
do
   curl -s "$line" | grep -Po '(?<=<title>).*(?=</title>)'
done < your_file

请注意,curl -s是指静默模式。以下是使用Google页面的示例:

$ curl -s http://www.google.com | grep -Po '(?<=<title>).*(?=</title>)'
302 Moved

在 grep 命令中,-P 参数的作用是什么? - aelor
-P 允许 grep 执行 Perl 正则表达式,就像我用来匹配 <title></title> 之间字符串的那个。你可以在 http://www.regular-expressions.info/lookaround.html 上了解更多相关信息。 - fedorqui
1
如果你在2023年遇到了一个简单的curl -O "$line"命令出现了curl: Failed to extract a sensible file name from the URL to use for storage!curl: (3) URL using bad/illegal format or missing URL等错误信息,而且你感到头痛不已,那么请检查源文件中的行尾符号(我的文本文件设置为CRLF时解析正常,设置为LF后也可以正常解析)。 - undefined

2
您可以使用xargs来仅使用一行代码完成此操作。假设您在工作目录中有一个名为sitemap的文件,其中包含所有URL(每行一个)。 xargs -I{} curl -s {} <sitemap | grep title 这将提取任何包含单词"title"的行。要提取标题标签,您需要稍微更改grep-o标志确保仅打印出匹配结果: xargs -I{} curl -s {} <sitemap | grep -o "<title>.*</title>" 如果您想提取某些数据,则需要\转义字符。
有时,根据字符集,您可能会得到带有特殊字符的异常curl输出。 如果检测到这种情况,则需要使用像iconv这样的实用程序切换编码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接