我在这里问我的第一个问题。 我正在创建一个与 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 的代码吗?
我尝试按原样运行代码,但正如前面提到的,生成的图像与所需的结果非常不同。
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"
关于转换,您需要将空白图像设为主图像,并将其他元素分层在其上。
或者,您可以将 x 值设置为您想要文本的位置,然后使用
e_trim
消除空白。