Beautiful Soup Автоматическая конвертация USD в TW
Я пытаюсь запустить демонстрацию Beautiful Soup, чтобы очистить цены с Ebay, и все цены указаны в долларах США, но по какой-то причине, когда я очищаю цены, он автоматически конвертирует их в NT$. Не уверен что происходит. Я попытался зайти на сайт в Великобритании, и он печатает правильную валюту. Я пробовал разные ссылки, ведущие на один и тот же сайт, но с идентификаторами Ebay в США, но все равно без разницы.
page = requests.get('https://www.ebay.com/sch/i.html?_from=R40&_nkw=dodge+viper&_sacat=0&_sop=20')
soup = bs(page.content)
prices = soup.find_all('span', class_='s-item__price')
2 ответа
Я понял. Как-то связан с Google Colab и тем, как он собирает информацию с Ebay. Я запустил код в Jupyter Notebook на своем локальном компьютере, и он работал нормально.
BeautifulSoup не имеет ничего общего с преобразованием цены, поскольку извлекает цену из HTML только тогда, когда вы извлекаете определенные фрагменты HTML с помощью селекторов CSS.
Изменить цену можно только поменяв домен eBay на какой-нибудь другой, также можно получить цены сразу с нескольких доменов:
# united states, hong kong, spain
domains = ["ebay.com", "ebay.com.hk", "ebay.es"]
for domain in domains:
page = requests.get(f"https://www.{domain}/sch/i.html", params=params, headers=headers, timeout=30)
soup = BeautifulSoup(page.text, 'lxml')
Проверьте полный код в интерактивной среде IDE.
from bs4 import BeautifulSoup
import requests, lxml
import json
# https://requests.readthedocs.io/en/latest/user/quickstart/#custom-headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
}
params = {
'_nkw': 'dodge viper', # search query
}
domains = ["ebay.com", "ebay.com.hk", "ebay.es"]
data_price = []
for domain in domains:
page = requests.get(f"https://www.{domain}/sch/i.html", params=params, headers=headers, timeout=30)
soup = BeautifulSoup(page.text, 'lxml')
for products in soup.select(".s-item__pl-on-bottom"):
data_price.append({"price": products.select_one(".s-item__price").text, "domain": domain})
print(json.dumps(data_price, indent=2, ensure_ascii=False))
Пример вывода:
[
{
"price": "$109,989.00",
"domain": "ebay.com"
},
{
"price": "HK$ 3,139.79",
"domain": "ebay.com.hk"
},
{
"price": "0,93 EUR",
"domain": "ebay.es"
},
other results ...
]
В качестве альтернативы вы можете использовать Ebay Organic Results API от SerpApi. Это платный API с бесплатным планом, который обрабатывает блоки и анализирует их на своем бэкэнде.
Пример кода:
from serpapi import EbaySearch
import json
# https://serpapi.com/ebay-domains
domains = ["ebay.com", "ebay.es", "ebay.com.hk"]
for domain in domains:
params = {
"api_key": "...", # serpapi key, https://serpapi.com/manage-api-key
"engine": "ebay", # search engine
"ebay_domain": domain, # ebay domain
"_nkw": "dodge viper", # search query
}
search = EbaySearch(params) # where data extraction happens
data = []
results = search.get_dict() # JSON -> Python dict
for organic_result in results.get("organic_results", []):
title = organic_result.get("title")
price = organic_result.get("price")
data.append({
"title" : title,
"price" : price,
"domain": domain
})
print(json.dumps(data, indent=2, ensure_ascii=False))
Выход:
[
{
"title": "Dodge Viper Valve Cover Gen 4 Driver side Gen V",
"price": {
"raw": "HK$ 2,315.60",
"extracted": 2315.6
},
"domain": "ebay.com.hk"
},
{
"title": "2M Borde de puerta de automóvil viaje al clima Sellado Pilar B Tira de protección contra el ruido a prueba de viento (Compatible con: Dodge Viper)",
"price": {
"raw": "26,02 EUR",
"extracted": 26.02
},
"domain": "ebay.es"
},
other results ...
]
Существует 13 способов извлечь любые общедоступные данные из любого сообщения в блоге веб-сайта, если вы хотите узнать больше о парсинге веб-сайтов.