【问题标题】:How to change names of scraped images with Python?如何使用 Python 更改抓取图像的名称?
【发布时间】:2021-08-27 09:02:09
【问题描述】:

所以我需要在CoinGecko上下载列表中每一个硬币的图片,所以我写了如下代码:

import requests
from bs4 import BeautifulSoup
from os.path  import basename

def getdata(url): 
    r = requests.get(url) 
    return r.text 
    
htmldata = getdata("https://www.coingecko.com/en") 
soup = BeautifulSoup(htmldata, 'html.parser')
for item1 in soup.select('.coin-icon img'):
    link = item1.get('data-src').replace('thumb', 'thumb_2x')
    with open(basename(link), "wb") as f:
            f.write(requests.get(link).content)

但是,我需要保存图像,其名称与 CoinGecko 列表中硬币的代码相同(将 bitcoin.png?1547033579 重命名为 BTC.pngethereum.png?1595348880 重命名为 ETH.png,等等) .需要重命名的图像超过 7000 张,其中许多具有非常独特的名称,因此切片在这里不起作用。

有什么办法呢?

【问题讨论】:

  • 所以你问如何将bitcoin.png?1547033579 重命名为Bitcoin.pngbasename(link).split('?')[0].upper()
  • 我编辑了 OP,所以它更有意义

标签: python web-scraping beautifulsoup python-requests screen-scraping


【解决方案1】:

我正在浏览 html 文件,发现您正在查看的标签有一个 alt 参数,该参数在字符串末尾有一个ticker。

<div class="coin-icon mr-2 center flex-column">
<img class="" alt="bitcoin (BTC)" data-src="https://assets.coingecko.com/coins/images/1/thumb/bitcoin.png?1547033579" data-srcset="https://assets.coingecko.com/coins/images/1/thumb_2x/bitcoin.png?1547033579 2x" src="https://assets.coingecko.com/coins/images/1/thumb/bitcoin.png?1547033579" srcset="https://assets.coingecko.com/coins/images/1/thumb_2x/bitcoin.png?1547033579 2x">
</div>

所以我们可以使用它来获得正确的名称,如下所示:


import requests
from bs4 import BeautifulSoup
from os.path  import basename

def getdata(url): 
    r = requests.get(url) 
    return r.text 
    
htmldata = getdata("https://www.coingecko.com/en") 
soup = BeautifulSoup(htmldata, 'html.parser')
for item1 in soup.select('.coin-icon img'):
    link = item1.get('data-src').replace('thumb', 'thumb_2x')
    raw_name = item1.get('alt')
    name = raw_name[raw_name.find('(') + 1:-1]
    with open(basename(name), "wb") as f:
            f.write(requests.get(link).content)

我们基本上是使用字符串切片来提取括号之间的值。

【讨论】:

  • 就是这样,太好了!这是我第一次遇到这样的命令“+ 1:-1”你能指出我在哪里可以阅读更多关于它是什么以及它背后的逻辑吗?
  • 它是python字符串切片,一个非常强大的工具,专门用于网页抓取。我正在做的只是一种在字符串切片上使用索引的聪明方法。您可以按正负索引对字符串进行切片,我将两者结合起来。对于字符串 example = 'america': |示例[1] => 'm' |示例[-2] => 'c' |示例[-4:] => 'rica' |
  • 仔细看代码,分割字符串的位是"raw_name[raw_name.find('(') + 1:-1]" 而不仅仅是"+ 1:-1 “!
【解决方案2】:

这是你可以做的事情:

import requests
from bs4 import BeautifulSoup
from os.path  import basename

url = "https://www.coingecko.com/en"

r = requests.get(url) 
soup = BeautifulSoup(r.text, 'html.parser')
for item1 in soup.select('td.coin-name[data-text]'):
    ticker_name = item1.select_one(".center > span").get_text(strip=True)
    image_link = item1.select_one(".coin-icon > img").get('data-src').replace('thumb','thumb_2x')
##    with open(f"{basename(ticker_name)}.png", "wb") as f:
    with open(basename(ticker_name), "wb") as f:
        f.write(requests.get(image_link).content)

【讨论】:

    【解决方案3】:

    我相信你可以很容易地使用字符串切片来实现这一点:

    import requests
    from bs4 import BeautifulSoup
    from os.path  import basename
    
    def getdata(url): 
        r = requests.get(url) 
        return r.text 
        
    htmldata = getdata("https://www.coingecko.com/en") 
    soup = BeautifulSoup(htmldata, 'html.parser')
    for item1 in soup.select('.coin-icon img'):
        link = item1.get('data-src').replace('thumb', 'thumb_2x')
        with open(basename(link[:link.find('?')]), "wb") as f:
                f.write(requests.get(link).content)
    

    我正在使用 [:] 对链接字符串的一部分进行切片,并寻找标记查询开始的问号。

    【讨论】:

    • 不幸的是,这不是我需要发生的事情,我编辑了原始帖子,所以现在更有意义了。我需要将图像重命名为我从相同列表中抓取它们的各自的代码(bitcoin.png?1547033579BTC.pngethereum.png?1595348880ETH.png 等等)
    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多