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 способов извлечь любые общедоступные данные из любого сообщения в блоге веб-сайта, если вы хотите узнать больше о парсинге веб-сайтов.

Другие вопросы по тегам