在 Cloudinary 上转换图像时出错:生成的 URL 包含不需要的标签

问题描述 投票:0回答:1

我在这里问我的第一个问题。 我正在创建一个与 Telegram 连接的抓取程序,该程序一旦通过 Selenium 在 Amazon 上抓取,就会通过请求获取产品信息,并将其作为帖子发送到我的 Telegram 频道上。 修饰我的帖子的一个新功能正是更改从亚马逊拍摄的默认图像,这些图像虽然质量很好,但没有我想要的信息。 我已经正确设置了工作环境,程序的其余部分运行得很好,但是由于我想实现此功能,所以我总是遇到问题。 从文档中我设法创建了这样的东西:

cloudinary.config(
  cloud_name = "my_cloud_name",
  api_key = "my_api_key",
  api_secret = "my_secret_api"
)


def get_product_info(product_id):
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0', }
    params = {'th': '1', 'psc': '1'}
    product_page = requests.get(url_from_id(product_id), headers=headers, params=params) 
    product_page_content = html.fromstring(product_page.content)

    try:
        title = product_page_content.xpath('//span[@id="productTitle"]/text()')[0].strip()
        old_price = product_page_content.xpath('//span[@data-a-strike="true"]//span[@aria-hidden="true"]/text()')[0]
        new_price = product_page_content.xpath('//span[contains(translate(@class, "PRICETOPAY", "pricetopay"), "pricetopay")]//span[@class="a-offscreen"]/text()')[0]

        if(new_price == ' '):

            new_price_whole = product_page_content.xpath('//span[contains(translate(@class, "PRICETOPAY", "pricetopay"), "pricetopay")]//span[@aria-hidden="true"]//span[@class="a-price-whole"]/text()')[0]

            new_price_decimal = product_page_content.xpath('//span[contains(translate(@class, "PRICETOPAY", "pricetopay"), "pricetopay")]//span[@aria-hidden="true"]//span[@class="a-price-fraction"]/text()')[0]

            new_price = new_price_whole + ',' + new_price_decimal + '€'

        discount_rate = "-" + str(round(100 - (parse_decimal(new_price.strip('€'), locale='it') / parse_decimal(old_price.strip('€'), locale='it')) * 100)) + "%"
        image = product_page_content.xpath('//img[@id="landingImage"]/@src')

        if(len(image) == 0):

            image = product_page_content.xpath('//div[contains(@class, "a-dynamic-image-container")]//img/@src')

        image_link = image[0].split("._")[0] + ".jpg"
       
        image_url = CloudinaryImage(f"{cloudinary_response['public_id']}.jpg").image(transformation=[
            {'height': 600, 'width': 1000, 'crop': "scale"},
            {'overlay': "jg0lqtleujlmcptwoxn8"},
            {'height': 500, 'width': 500, 'crop': "limit"},
            {'flags': "layer_apply", 'gravity': "west", 'x': 100},
            {'color': "#000000", 'overlay': {'font_family': "roboto", 'font_size': 100, 'font_weight': "bold", 'text_align': "left", 'text': "0000%252C00%E2%82%AC"}},
            {'flags': "layer_apply", 'gravity': "east", 'x': 50},
            {'color': "#333333", 'overlay': {'font_family': "roboto", 'font_size': 90, 'font_weight': "bold", 'text_align': "left", 'text': "0000%252C00%E2%82%AC"}},
            {'flags': "layer_apply", 'gravity': "south_east", 'x': 50, 'y': 125},
            {'color': "#FF0000", 'overlay': {'font_family': "roboto", 'font_size': 100, 'font_weight': "bold", 'font_style': "italic", 'text_align': "left", 'text': "-000%25"}},
            {'flags': "layer_apply", 'gravity': "north_east", 'x': 50, 'y': 125}
            ])

        print(image_url)

        return {
            "product_id": product_id,
            "title": title,
            "old_price": old_price,
            "new_price": new_price,
            "discount_rate": discount_rate,
            "image_link": image_url
        }

    except Exception as e:
        print("\nError for product id:\n\n" + product_id + "\n\nbecause:\n\n" + str(e) + "\n Probably strange formatting of webpage.\n")
        return None

但是,我注意到如果我去打印 image_url,结果与我希望的完全不同。 首先,URL 不是以

http://
https://
开头,而是包含在
<img src>
标签中,即像这样
<img src="http://res.cloudinary.com/dnqxjtoqy/image/upload/c_scale,h_600,w_1000/l_jg0lqtleujlmcptwoxn8/c_limit,h_500,w_500/fl_layer_apply,g_west,x_50/co_rgb:FF0000,l_text:roboto_125_bold_left:104%252C90%24/fl_layer_apply,g_east,x_50,y_-75/co_rgb:000000,l_text:roboto_100_bold_left:126%252C01%24/fl_layer_apply,g_east,x_50,y_50/pb5b0dwvpjsnmi67afb2.jpg"/>
;由此可见,对于 Telegram 来说,这是难以理解的

放置在

'overlay'
中的图像是this,即放置我的照片的白色背景。

期望的结果应该类似于 this,其中应该是从

image_link
获得的图像而不是左侧的图像,而我得到的是 this

您能帮我创建正确编辑

image_link
图像并将其正确发送到 Telegram 的代码吗?

我尝试按原样运行代码,但正如前面提到的,生成的图像与所需的结果非常不同。

python selenium-webdriver web-scraping cloudinary
1个回答
0
投票

Cloudinary Image 会产生标签,这是预期的。如果您只想要 URL,请使用构建 URL 实用程序。

    from cloudinary import CloudinaryImage

CloudinaryImage("sample.jpg").build_url(
  width = 100, height = 150, crop = 'fill')

# Output: "https://res.cloudinary.com/demo/image/upload/c_fill,h_150,w_100/sample.jpg"

cloudinary.utils.cloudinary_url("sample_spreadsheet.xls", 
  resource_type = "raw")

# Output: "https://res.cloudinary.com/demo/raw/upload/sample_spreadsheet.xls"

关于转换,您需要将空白图像设为主图像,并将其他元素分层在其上。

https://res.cloudinary.com/dnqxjtoqy/image/upload/c_scale,h_600,w_1000/l_pb5b0dwvpjsnmi67afb2/c_limit,h_500,w_500/fl_layer_apply,g_east/co_rgb:FF0000,l_text:roboto_125_bold_left :104%252C90%24/ fl_layer_apply,g_west,x_50,y_-75/co_rgb:000000,l_text:roboto_100_bold_left:126%252C01%24/fl_layer_apply,g_west,x_50,y_50/jg0lqtleujlmcptwoxn8.jpg

或者,您可以将 x 值设置为您想要文本的位置,然后使用

e_trim
消除空白。

https://res.cloudinary.com/dnqxjtoqy/image/upload/c_scale,h_600,w_1000/co_rgb:FF0000,l_text:roboto_125_bold_left:104%252C90%24/fl_layer_apply,g_west,x_-150,y_-75/ co_rgb:000000,l_text:roboto_100_bold_left:126%252C01%24/fl_layer_apply,g_west,x_50,y_50/e_trim/pb5b0dwvpjsnmi67afb2.jpg

© www.soinside.com 2019 - 2024. All rights reserved.