【问题标题】:Image download from Google Shopping tab using BeautifulSoup使用 BeautifulSoup 从 Google 购物标签下载图片
【发布时间】:2020-09-08 12:03:03
【问题描述】:

我想使用 BeautifulSoup 从 Google 购物 标签下载图片。但是,此页面中的 <img> 元素包含具有以下格式的 src 属性。

data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

整个页面中的每个<img> 元素都具有相同的src 属性值。

这不同于 Google 图片,其中存在正确的图片网址。

如何下​​载这些图片? 另一种方法是打开这些购物网站 URL 并下载图片,但这并不能保证我会下载相同的图片。

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    您看到的是图像的base64 编码,这是在网络上传输图像的标准方式(阅读更多here)。

    data:image/gif;base64, 前缀后面的字符实际上是图像本身,它只需要解码。试试下面的代码,看能否成功解码图片。

    import base64
    
    # assume `src` is the scraped src from the <img> tag
    
    img_encoded = src.split(',')[1]             # extract the encoding
    img_decoded = base64.b64decode(img_encoded) # decode
    with open('file.gif', 'wb') as f:         
        f.write(img_decoded)                    # write the file as a .gif
    

    尝试打开file.gif,查看图片是否解码成功。

    【讨论】:

    • 是的。我读过它。但是,此字符串非常小,并且页面上的每个图像都存在相同的字符串。我应该如何理解它?我真的很困惑。
    • 我查看了 Google 购物图片,并成功解码了其中一张。我建议首先尝试将 b64 编码从浏览器复制粘贴到 python 脚本,并确保代码按预期运行。然后尝试将复制粘贴的 b64 编码的长度与抓取的 b64 编码的长度进行比较。如果它们的大小不大致相同,则可能是 Google 为您提供了一个占位符图像,而实际图像可能由 JS 脚本加载。
    • 那么你是使用 src 属性的数据还是从 JS Script "var s="?
    • 测试时我只是从&lt;img&gt;标签复制粘贴src属性。 src 可能无法通过简单的 GET 请求获得,因为它可以稍后由 JS 脚本加载
    【解决方案2】:

    我终于找到了丢失的部分。 (这方面的专家,如果我的假设没有意义,请纠正我的假设)

    我可以看到每张图片都有以下 img 元素。

    <img alt="" class="TL92Hc" data-deferred="1" id="srpresultimg_13038633776657256825_1_0" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" style="height:180px;width:153px" />
    

    这里有一个名为data-deferred 的属性被设置为“1”。因此,我认为我需要在页面的其他位置搜索此 img 元素的 id 属性。然后我找到了一个 Javascript 代码,该代码将这个 id 与图像内容相关联,如下所示 -

    <script nonce="OnanMpQNnve2s3LIbFHDqQ==">
                    (function() {
                        var s = <huge_image_data_string>;
    var ii = ['srpresultimg_13038633776657256825_1_0'];
                        _setImagesSrc(ii, s);
                    })();
    

    部分是我要查找的数据。

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多