Metadata-Version: 2.4
Name: untappd-scraper
Version: 1.0.1
Summary: Scrape various Untappd web pages and return as parsed dataclasses
Keywords: beer,scraper,untappd
Author: Wardy
Author-email: Wardy <wardy3@gmail.com>
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.15
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Dist: pyyaml>=6.0.2
Requires-Dist: beautifulsoup4>=4.13.3
Requires-Dist: brotli>=1.1.0
Requires-Dist: haversine>=2.9.0
Requires-Dist: httpx[brotli,http2,zstd]>=0.28.1
Requires-Dist: logfire[httpx]>=3.14.1
Requires-Dist: loguru>=0.7.3
Requires-Dist: parse>=1.20.2
Requires-Dist: pydantic>=2.12.4
Requires-Dist: python-dateutil>=2.9.0.post0
Requires-Dist: utpd-models-web>=0.5.1
Requires-Dist: wardy-utils[web]>=2.0.0
Requires-Python: >=3.14
Description-Content-Type: text/markdown

# Untappd Scraper

Web scrape public Untappd pages into data classes.

## Quickstart

### User queries

```python
from untappd_scraper.user import User

users = ["gregavola"]

for user_id in users:
    user = User(user_id)
    print(f"\n{user.name=}")

    for checkin in user.activity():
        print(f"\n\t{checkin.name=}\n\t\t{checkin}")

    print("\n\nLists:")

    for userlist in user.lists():
        print(f"\n\t{userlist.name=} {userlist.num_items=}")

    print("\n\nRecent Venues:")

    for venue in user.venue_history():
        ago = datetime.now().date() - venue.last_visit
        print(
            f"\n\t{venue.name=} {venue.last_visit.strftime('%b %d %Y')} "
            + f"({ago.days} days ago)"
        )```

    print("\n\nRecent Uniques:")

    for beer in user.beer_history():
        print(f"\t{beer}, {beer.total_checkins=}")
```

### Venue queries

```python
from untappd_scraper.venue import Venue

venue_ids = [
    14705,  # 4 pines
    99967,  # collaroy
]

for venue_id in venue_ids:
    venue = Venue(venue_id)
    print(f"\n{venue.name=}")

    for num, checkin in enumerate(venue.activity(), start=1):
        print(f"\n\t{num=}\t{checkin.name=}\n\t\t{checkin}")

# Load a venue by name. Try to be as unambiguous as possible
venue = Venue.from_name("hotel sweeney")
print(f"\n{venue.name=} {venue.verified=}\t{venue.categories=}\n")
print("\n".join([str(beer) for beer in venue.activity()]))

for menu in venue.menus():
    print(f"\n{menu.selection=} / {menu.name=}")

    print("\n\t\t", end="")
    print("\n\t\t".join(str(beer) for beer in menu.beers))
```

## Notes

untappd-scraper is just that - a scraper. It doesn't store data. So, for example,
if you query a user's unique beer history (with `User.beer_history()`) you will not
be able to see the entire history. Just what is public on the web, which is the most
recent 25 uniques.