如何访问网站(需要用户名和密码)并将以 .csv.gz 结尾的所有文件的完整网站链接提取到 .txt 文件中(每行一行)。我不想从子文件夹中提取数据。
例如我希望将以下内容保存到 my.txt
http://www.google.com/1.csv.gz
http://www.google.com/xyz.csv.gz
但不应该保存
http://www.google.com/extra/abc.csv.gz
答案1
与 FTP 和其他一些协议不同,HTTP 协议不存在“拉取”所有文件列表之类的事情。如果你想获取 ( GET
) 一个文件,你必须知道它的 URL。
许多 Web 服务器提供了一项便利功能(通常称为自动索引),该功能针对 URL生成一个 HTML 页面,其中包含指向服务器上该目录中存在的每个http://site/directory/
URL 表单的链接列表,从而提供一种伪文件列出客户可以发现的列表。然而,此功能几乎从未用于站点的顶级目录 ( ),因为站点作者通常会为站点的顶级 URL 提供显式 HTML 页面。因此,如果存在,您通常无法找到它,除非您提前知道它的存在。http://site/directory/file
file
http://site/
http://www.google.com/1.csv.gz
如果您正在处理一个为您提供文件索引的 Web 服务器,那么您可以很容易地将列表从 HTML 转换为文本,并使用awk
或进行一些文本处理sed
,但这取决于特定 Web 服务器返回的确切格式它的 HTML 列表...
curl http://site/ | sed -e [....]
答案2
我假设您想要的所有文件都列在网站的索引页中。如果是这样,您可以使用文本浏览器,例如山猫转储该页面中找到的网址列表,然后使用 sed 提取您想要的网址。例如:
lynx -auth=ID:PASSWD -dump http://www.google.com |
sed '1,/^References/d
\:www\.google\.com/[^/]*\.csv\.gz$:!d
s/^ *[^ ]* //
' >my.txt
sed 删除 (d) 所有行,直到最后的引用列表(即 url 链接)。然后它会删除与您的模式不匹配的行(\:
引入一个新的模式分隔符:
而不是/
这样我们可以在模式中使用 / 而无需转义它)。[^/]*
匹配除 . 之外的任何字符/
。
$
是行尾。然后它会删除 lynx 用于 url 的编号。