Exchange rates parserDevelopment & Customization

A Python parser that saves open exchange and crypto rates into a table with the time of each reading

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment protectionDetails
  • Revisions within the package are free.
  • If you do not respond within 3 days of delivery, the work is accepted automatically.

The money is reserved when you pay and released only once you accept the work.

A Python parser that saves open exchange and crypto rates into a table with the time of each reading

Example result

Example for the Standard package

Parser of a garden tools supplier's catalog into Excel

What the result looks like

ArticleNamePriceIn stockWeightPhoto
GT-1042Pruning shears, 20 mm18.90Yes0.24 kg…/gt-1042.jpg
GT-1187Folding saw, 210 mm24.50Yes0.31 kg…/gt-1187.jpg
GT-2210Hedge shears, wavy blade39.00No1.10 kg…/gt-2210.jpg
GT-3305Hand trowel, stainless9.80Yes0.18 kg…/gt-3305.jpg
GT-4120Garden hose 25 m, 1/2"42.00Yes2.90 kg…/gt-4120.jpg

The file in the example has 1,236 products from 52 list pages.

A part of the code

def product_links(list_url: str) -> Iterator[str]:
    """Product page links from every page of the list, following 'Next'."""
    url: str | None = list_url
    while url:
        page = fetch(url)
        for card in page.select("div.product-card a.title"):
            yield urljoin(url, card["href"])
        next_link = page.select_one("a.pagination-next")
        url = urljoin(url, next_link["href"]) if next_link else None


def fetch(url: str) -> BeautifulSoup:
    """One open page, at a polite pace: a pause between requests and a few tries on errors."""
    for attempt in range(3):
        time.sleep(settings.delay_seconds)
        response = session.get(url, timeout=30)
        if response.status_code == 200:
            return BeautifulSoup(response.text, "html.parser")
        log.warning("%s answered %s, try %d of 3", url, response.status_code, attempt + 1)
    raise ScraperError(f"{url} did not open after 3 tries")

Files: a ZIP archive with scraper.py, settings.ini (the start page, the pause between requests, the file name), requirements.txt and a README on installing and running it. It reads only open pages, one every 2 seconds, and checks the site's robots.txt first. The client runs it on their own computer.

Client: an online garden shop that resells a supplier's tools; the supplier has an open catalog on its website but no price list file. Task: go through the catalog's list pages, open every product page and save the article number, name, price, stock, weight and main photo link to Excel, to compare prices once a week.

The client and all details are made up.

About this service

Exchange offices, shops that price in several currencies and bookkeepers use this parser to save rates from open pages into a table: currency or coin, buy and sell rate, official rate, change for the day when shown, the source and the time of the reading. Send the pages you take rates from, such as a bank's public rates table, and one or two of them saved from your browser. You get Python code, a settings file and a README and run it on your computer when you need a reading. Rates are copied as the page shows them at that moment: it is not a live feed and gives no financial advice or forecasts. Where a source has an official open data feed, we say so. It reads open pages at a polite pace and never logs in or gets around captchas or protection. You decide whether the site's terms allow it; a later layout change needs an update.

What is included

  • What you getA ZIP archive with the Python code, a settings file and a README with step-by-step instructions; the code is also shown on the order page.
  • Buy and sell apartSeparate columns, as numbers
  • Time of each readingDate and time in every row
  • Source in a columnSo rates from different pages stay apart
  • Polite paceNot every second: a pause you set
  • Runs on your computerWindows, macOS or Linux, with Python

How it works

  1. 1
    SourcesYou give the rate pages and the currencies or coins
  2. 2
    ParserWe write the code and the guide to running it
  3. 3
    RunYou run it and compare the first reading with the site
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

The pages you take rates from, with links, and the currencies or coins you need. The fields in the order of your table, e.g. currency, buy, sell, official rate, change, source, time. One or two of those pages saved from your browser (File > Save page as) or screenshots. How often you need a reading, the number format (dot or comma), and CSV or Excel.

We will ask you:

  • Which pages?
  • Currencies or coins
  • The fields you need
  • How often will you run it?

Compare packages

PackagesBasicRates from one page$22StandardList and currency pages$43PremiumUp to 3 sources$76
Deadline1 day2 days3 days
Revisions123
Sites11up to 3
Kinds of page12 (list and currency page)up to 3
Fieldsup to 10up to 25up to 25 on each
Goes through the pages of a listNoYesYes
Results fileCSVExcel or CSVExcel, CSV or JSON
Duplicates removed, resumes where it stoppedNoNoYes
Time of reading in each rowYesYesYes
Order BasicOrder StandardOrder Premium

Payment protection

You pay when you order, but the money is released only for accepted work.

  • Fixed priceThe package price does not change after you pay.
  • The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
  • Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
  • Free revisionsAsk for changes within your brief as many times as the package allows.
  • Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
  • Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
How it works →

Questions and answers

Can it update rates every second for trading?

No. It reads pages at a polite pace when you run it, so it suits a reading every hour or every day, not trading. For live prices, use the official API of an exchange; keys for it never go into our code.

Can I use these rates for my prices or bookkeeping?

Which source counts as official for you is your decision, and your accountant's. The parser copies rates as the page shows them; we give no financial advice.

Can it read my balance or rates inside an exchange account?

No. It never logs in, and passwords, tokens and keys never go into the code or to us.

Which sites are out?

Google, Amazon, LinkedIn and social networks, pages behind a captcha or a sign-in, and rates drawn as pictures. For other sites, you decide whether their terms allow it. After a layout change the parser needs an update.

Did not find your answer?

Packages