【问题标题】:Download all linked files from Wikipedia page从维基百科页面下载所有链接文件
【发布时间】:2014-06-14 14:40:48
【问题描述】:

我想使用这个 Wikipedia 页面 - http://en.wikipedia.org/wiki/Current_members_of_the_United_States_House_of_Representatives

它包含几个指向.jpg 图像的链接,我想将所有图像下载到一个文件夹中。我在 Mac 上。

我曾尝试使用wget,但目前无法使用。

编辑:澄清一下,我想要一个脚本来点击页面上的每个链接,然后下载页面。这是因为我需要先重定向页面。

【问题讨论】:

    标签: bash download wget wikipedia


    【解决方案1】:

    您可以为此使用xmlstarlet

    xmlstarlet sel --net --html -t -m "//img" -v "@src" -n 'http://en.wikipedia.org/wiki/Current_members_of_the_United_States_House_of_Representatives'
    

    将为您提供http://en.wikipedia.org/wiki/Current_members_of_the_United_States_House_of_Representatives页面中img标签的所有src字段。

    您会注意到输出行缺少标题 http:,因此我们必须添加它。

    然后:

    while IFS= read -r line; do
        [[ $line = //* ]] && line="http:$line"
        wget "$line"
    done < <(
        xmlstarlet sel --net --html -t -m "//img" -v "@src" -n 'http://en.wikipedia.org/wiki/Current_members_of_the_United_States_House_of_Representatives'
    )
    

    应该检索图像文件。


    从您的评论中,我现在了解您的要求:您想要获取包含 img 节点的 a 节点的所有 href 字段。满足此要求的xpath 是:

    //a[img]
    

    因此,

    xmlstarlet sel --net --html -t -m "//a[img]" -v "@href" -n 'http://en.wikipedia.org/wiki/Current_members_of_the_United_States_House_of_Representatives'
    

    会给你这些hrefs。

    现在,检索到的 URL 不是直接要下载的图像;相反,它是另一个 HTML 页面,其中包含指向所需图像的链接。我使用以下 xpath 选择了这些页面中的图像:

    //div[@class='fullImageLink']/a
    

    即,div 节点内的a 节点与class="fullImageLink"。这似乎没问题,启发式的。

    那么,应该这样做:

    #!/bin/bash
    
    base="http://en.wikipedia.org"
    
    get_image() {
       local url=$base$1
       printf "*** %s: " "$url"
       IFS= read -r imglink < <(xmlstarlet sel --net --html -t -m "//div[@class='fullImageLink']/a" -v "@href" -n "$url")
       if [[ -z $imglink ]]; then
          echo " ERROR ***"
          return 1
       fi
       imglink="http:$imglink"
       echo " Downloading"
       wget -q "$imglink" &
    }
    
    while IFS= read -r url; do
       [[ $url = /wiki/File:* ]] || continue
       get_image "$url"
    done < <(
       xmlstarlet sel --net --html -t -m "//a[img]" -v "@href" -n "$base/wiki/Current_members_of_the_United_States_House_of_Representatives"
    )
    

    你会得到比你想要的多一点,但这是一个很好的基础:)

    【讨论】:

    • 对不起,它不起作用。它做了我以前可以做的事情。它直接从页面下载图像,无需等待重定向。我希望它转到一个链接,重定向到一个链接,然后下载该链接
    • @user3702835 什么?我不明白你的要求。
    • 看,如果我去那个维基百科页面并下载它,我会得到所有的缩略图,这就是你的脚本所做的。我想要全分辨率图像,只能通过首先单击图像缩略图,重定向到全尺寸图像,然后下载它来获得。
    • 太好了,效果很好!给其他读者的建议:xmlstartlet 不适用于 Mac,它只是 xml。此外,脚本需要权限才能运行 - chmod u+rwx file.sh
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多