仅使用部分链接使用wget下载html页面

时间:2018-08-08 04:40:12

标签: bash web web-scraping wget

我正在编写一个bash脚本,以使用wget下载当天html网页的当前natgeo照片,它每天都在变化。当我转到链接https://www.nationalgeographic.com/photography/photo-of-the-day/时,它将重定向到当前页面,即https://www.nationalgeographic.com/photography/photo-of-the-day/2018/08/mandalay-golden-sunrise/,当天的照片在网站上每天都会更改。我想wget仅使用第一个链接下载第二个html链接(每天都会更改)(在浏览器中键入时会将我重定向到第二个链接)。我该怎么办?

直到现在我都尝试过:

longest=[]
current=[]

while True:
    n = int(input())
    if n == -1:
        break

    if current % current[-1] == 0:
        current.append(n)
    else:
        current = [n]

    if len(current) > len(longest):
        longest = current

print(len(longest))

但是它没有给我想要的第二个链接html页面。

3 个答案:

答案 0 :(得分:1)

这将为您工作,它是一个简单易行的好代码。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js"></script>
    <style>
        html, body {
            height: 100%;
            margin: 0;
        }

        #divcontainer {
            border: 1px solid lightgray;
            width: 100%
            height: 100%

        }

        #makeitmove {
            background: lightgray;
            resize: both;
            overflow: auto;
            text-align: center;
            width: 500px;
            height: 76px;
            border: 1px solid grey;
        }

        #drag {
            height: 20px;
            width: 100%;
            background: blue;
        }

    </style>
    <script>
        $(document).ready(function () {
            $("#makeitmove").draggable({containment: "#divcontainer", handle: '#drag', scroll: false});
        });
    </script>
    <div id="window" style="display: none;"></div>
</head>
<body>
    <div id="divcontainer" style="height: 100vh;">
        <div id="makeitmove">
            <div id="drag"></div>
            Calculator
        </div>
    </div>
</body>
</html>

它将把您要查找的URL写入名为 desired_url 的文件中:

该文件将类似于:

  

https://www.nationalgeographic.com/photography/photo-of-the-day/2018/08/mandalay-golden-sunrise/

这是您想要的网址。

要下载文件,您只需执行以下操作:

curl https://www.nationalgeographic.com/photography/photo-of-the-day/ | grep -m 1 https://www.nationalgeographic.com/photography/photo-of-the-day/ | cut -d '=' -f 3 |head -c-3 > desired_url

答案 1 :(得分:0)

尝试一下:

#! /bin/bash

url=https://www.nationalgeographic.com/photography/photo-of-the-day/

wget -q -O- "$url" > index.html

og_url=$(xmllint --html --xpath 'string(//meta[@property="og:url"]/@content)' index.html 2>/dev/null)
og_image=$(xmllint --html --xpath 'string(//meta[@property="og:image"]/@content)' index.html 2>/dev/null)

rm index.html

name=${og_url%/}
name=${name##*/}
file="$name".jpg

wget -q -O "$file" "$og_image"
echo "$file"

首先,它加载基本URL。然后,它使用xmllint提取相关信息。标准错误被忽略,因为HTML代码包含许多错误。但是xmllint仍然可以解析HTML页面的相关部分。图像的名称是URL的一部分,该URL存储在具有属性content的{​​{1}}元素中的属性meta的值中。图像的URL存储在具有属性property=og:url的相似meta元素中。 Bash的parameter substitution用于制作文件名。在第二个property=og:image中使用文件名和URL来加载图像。最后,脚本报告了所创建文件的名称。

答案 2 :(得分:0)

如果您严格希望使用wget,则必须下载第一个URL的页面以获取每天更改的地址。由于我们不会将下载的页面用于其他任何事情,因此可以将其下载到/ tmp。我将下载的页面文件重命名为NG.html

wget https://www.nationalgeographic.com/photography/photo-of-the-day -O /tmp/NG.html

我认为您想要的URL是指向图片的直接链接,本例中为

https://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDNcYRm8vejuXg0QxTzqdASwYhpl6e-h74GxPyqutLd15lrhO2QpHQIwDhQhoBQJTxpBSU4oz1-dHfqeGM_woeke6FIaD5wOrPsDo_UOe_nesId87TLVU8qeMyW07MHDznqt_vj5hZAtvQEpuBxw4bZQEeUoPC_zgoESthc9dS8cSTY2RA/

我们怎么得到的?

一种方法是使用“ twitter:url”对标记进行grep并在其下方打印一行。

grep -A 1 twitter:url  /tmp/NG.html

“-A 1”参数在包含我们要搜索的模式的行之后再打印一行。结果是这样的:

 grep -A 1 twitter:url  /tmp/NG.html
<meta property="twitter:url" content="https://www.nationalgeographic.com/photography/photo-of-the-day/2018/08/mandalay-golden-sunrise/"/>
<meta property="og:image" content="https://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDNcYRm8vejuXg0QxTzqdASwYhpl6e-h74GxPyqutLd15lrhO2QpHQIwDhQhoBQJTxpBSU4oz1-dHfqeGM_woeke6FIaD5wOrPsDo_UOe_nesId87TLVU8qeMyW07MHDznqt_vj5hZAtvQEpuBxw4bZQEeUoPC_zgoESthc9dS8cSTY2RA/"/>

现在,我们可以对“ og:image”进行grep选择,以仅选择包含我们网址的行。之前我们无法grep表示“ og:image”,因为文档中还有其他带有“ og:image”的标签。

所以现在我们只得到包含URL的最后一行:

grep -A 1 twitter:url  /tmp/NG.html | grep "og:image"
<meta property="og:image" content="https://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDNcYRm8vejuXg0QxTzqdASwYhpl6e-h74GxPyqutLd15lrhO2QpHQIwDhQhoBQJTxpBSU4oz1-dHfqeGM_woeke6FIaD5wOrPsDo_UOe_nesId87TLVU8qeMyW07MHDznqt_vj5hZAtvQEpuBxw4bZQEeUoPC_zgoESthc9dS8cSTY2RA/"/>

现在我们可以使用cut从HTML标记内部提取URL

如果我们使用'“'符号作为分隔符(分隔符),则第4个字段将是URL:

1 <meta property=
2 og:image
3 content=
4 https://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDNcYRm8vejuXg0QxTzqdASwYhpl6e-h74GxPyqutLd15lrhO2QpHQIwDhQhoBQJTxpBSU4oz1-dHfqeGM_woeke6FIaD5wOrPsDo_UOe_nesId87TLVU8qeMyW07MHDznqt_vj5hZAtvQEpuBxw4bZQEeUoPC_zgoESthc9dS8cSTY2RA/
5 />

因此,现在使用带有定界符'“'的cut并选择第四个字段,它将为我们提供:

 grep -A 1 twitter:url  /tmp/NG.html | grep "og:image" | cut -d '"' -f 4
https://yourshot.nationalgeographic.com/u/fQYSUbVfts-T7odkrFJckdiFeHvab0GWOfzhj7tYdC0uglagsDNcYRm8vejuXg0QxTzqdASwYhpl6e-h74GxPyqutLd15lrhO2QpHQIwDhQhoBQJTxpBSU4oz1-dHfqeGM_woeke6FIaD5wOrPsDo_UOe_nesId87TLVU8qeMyW07MHDznqt_vj5hZAtvQEpuBxw4bZQEeUoPC_zgoESthc9dS8cSTY2RA/

现在,我们可以提供该URL到wget并将其另存为jpg

wget $( grep -A 1 twitter:url  /tmp/NG.html | grep "og:image" | cut -d '"' -f 4) -O image.jpg

在摘要中,您需要运行2行:

wget https://www.nationalgeographic.com/photography/photo-of-the-day -O /tmp/NG.html
wget $( grep -A 1 twitter:url  /tmp/NG.html | grep "og:image" | cut -d '"' -f 4) -O image.jpg