scrapebadger-cli 0.2.1__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/PKG-INFO +8 -1
  2. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/README.md +7 -0
  3. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/pyproject.toml +1 -1
  4. scrapebadger_cli-0.3.0/src/scrapebadger_cli/commands/redfin.py +121 -0
  5. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/main.py +2 -0
  6. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/.gitignore +0 -0
  7. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/__init__.py +0 -0
  8. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/client.py +0 -0
  9. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/__init__.py +0 -0
  10. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/amazon.py +0 -0
  11. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/auth.py +0 -0
  12. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/ebay.py +0 -0
  13. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/google.py +0 -0
  14. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/idealista.py +0 -0
  15. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/immobiliare.py +0 -0
  16. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/leboncoin.py +0 -0
  17. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/loopnet.py +0 -0
  18. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/realtor.py +0 -0
  19. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/reddit.py +0 -0
  20. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/stream.py +0 -0
  21. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/tiktok.py +0 -0
  22. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/twitter.py +0 -0
  23. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/vinted.py +0 -0
  24. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/web.py +0 -0
  25. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/youtube.py +0 -0
  26. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/zillow.py +0 -0
  27. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/config.py +0 -0
  28. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/output.py +0 -0
  29. {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scrapebadger-cli
3
- Version: 0.2.1
3
+ Version: 0.3.0
4
4
  Summary: ScrapeBadger CLI — Twitter, Vinted, Google, and Web Scraping from the command line
5
5
  Author: ScrapeBadger Team
6
6
  License: MIT
@@ -28,6 +28,13 @@ Command-line interface for ScrapeBadger — Twitter, Vinted, and Web Scraping.
28
28
 
29
29
  ```bash
30
30
  pip install scrapebadger-cli
31
+ # or: uv tool install scrapebadger-cli
32
+ ```
33
+
34
+ The installed command is `scrapebadger`. To run without installing:
35
+
36
+ ```bash
37
+ uvx --from scrapebadger-cli scrapebadger --help
31
38
  ```
32
39
 
33
40
  ## Quick Start
@@ -6,6 +6,13 @@ Command-line interface for ScrapeBadger — Twitter, Vinted, and Web Scraping.
6
6
 
7
7
  ```bash
8
8
  pip install scrapebadger-cli
9
+ # or: uv tool install scrapebadger-cli
10
+ ```
11
+
12
+ The installed command is `scrapebadger`. To run without installing:
13
+
14
+ ```bash
15
+ uvx --from scrapebadger-cli scrapebadger --help
9
16
  ```
10
17
 
11
18
  ## Quick Start
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "scrapebadger-cli"
3
- version = "0.2.1"
3
+ version = "0.3.0"
4
4
  description = "ScrapeBadger CLI — Twitter, Vinted, Google, and Web Scraping from the command line"
5
5
  requires-python = ">=3.10"
6
6
  license = {text = "MIT"}
@@ -0,0 +1,121 @@
1
+ """Redfin real-estate commands."""
2
+
3
+ import typer
4
+
5
+ from scrapebadger_cli.client import api_get
6
+ from scrapebadger_cli.output import render
7
+
8
+ app = typer.Typer(no_args_is_help=True)
9
+
10
+ FMT = typer.Option("json", "--output", "-o", help="Output format: json, csv, table, markdown")
11
+ FIELDS = typer.Option(None, "--fields", "-f", help="Comma-separated fields to include")
12
+
13
+
14
+ @app.command()
15
+ def search(
16
+ location: str = typer.Argument(..., help="City/state, ZIP, address or neighborhood"),
17
+ page: int = typer.Option(1, "--page", "-p", help="1-20"),
18
+ sort: str | None = typer.Option(
19
+ None, "--sort", help="relevant, newest, price_low_to_high, etc."
20
+ ),
21
+ price_min: int | None = typer.Option(None, "--price-min"),
22
+ price_max: int | None = typer.Option(None, "--price-max"),
23
+ beds_min: int | None = typer.Option(None, "--beds-min"),
24
+ baths_min: float | None = typer.Option(None, "--baths-min"),
25
+ home_type: str | None = typer.Option(
26
+ None,
27
+ "--home-type",
28
+ help="house, condo, townhouse, multi_family, land, other, mobile, coop",
29
+ ),
30
+ sqft_min: int | None = typer.Option(None, "--sqft-min"),
31
+ sqft_max: int | None = typer.Option(None, "--sqft-max"),
32
+ lot_min: int | None = typer.Option(None, "--lot-min"),
33
+ lot_max: int | None = typer.Option(None, "--lot-max"),
34
+ year_built_min: int | None = typer.Option(None, "--year-built-min"),
35
+ year_built_max: int | None = typer.Option(None, "--year-built-max"),
36
+ max_days_on_market: int | None = typer.Option(None, "--max-days-on-market"),
37
+ north: float | None = typer.Option(None, "--north", help="Map bounds for tiling past the cap"),
38
+ south: float | None = typer.Option(None, "--south"),
39
+ east: float | None = typer.Option(None, "--east"),
40
+ west: float | None = typer.Option(None, "--west"),
41
+ fmt: str = FMT,
42
+ fields: str | None = FIELDS,
43
+ ) -> None:
44
+ """Search Redfin for for-sale properties."""
45
+ data = api_get(
46
+ "/v1/redfin/search",
47
+ {
48
+ "location": location,
49
+ "page": page,
50
+ "sort": sort,
51
+ "price_min": price_min,
52
+ "price_max": price_max,
53
+ "beds_min": beds_min,
54
+ "baths_min": baths_min,
55
+ "home_type": home_type,
56
+ "sqft_min": sqft_min,
57
+ "sqft_max": sqft_max,
58
+ "lot_min": lot_min,
59
+ "lot_max": lot_max,
60
+ "year_built_min": year_built_min,
61
+ "year_built_max": year_built_max,
62
+ "max_days_on_market": max_days_on_market,
63
+ "north": north,
64
+ "south": south,
65
+ "east": east,
66
+ "west": west,
67
+ },
68
+ )
69
+ render(data, fmt, fields)
70
+
71
+
72
+ @app.command()
73
+ def property(
74
+ property_id: str = typer.Argument(..., help="Redfin numeric property id"),
75
+ fmt: str = FMT,
76
+ fields: str | None = FIELDS,
77
+ ) -> None:
78
+ """Get a Redfin property's full detail by propertyId."""
79
+ data = api_get(f"/v1/redfin/property/{property_id}", {})
80
+ render(data, fmt, fields)
81
+
82
+
83
+ @app.command("property-url")
84
+ def property_url(
85
+ url: str = typer.Argument(..., help="Full Redfin property URL (/CA/City/.../home/12345678)"),
86
+ fmt: str = FMT,
87
+ fields: str | None = FIELDS,
88
+ ) -> None:
89
+ """Get a Redfin property's full detail by home URL."""
90
+ data = api_get("/v1/redfin/property", {"url": url})
91
+ render(data, fmt, fields)
92
+
93
+
94
+ @app.command()
95
+ def agent(
96
+ agent_id: str | None = typer.Argument(None, help="Redfin agent id"),
97
+ url: str | None = typer.Option(None, "--url", help="Full Redfin /realestateagents/... URL"),
98
+ fmt: str = FMT,
99
+ fields: str | None = FIELDS,
100
+ ) -> None:
101
+ """Get a Redfin agent's profile and their active listings."""
102
+ data = api_get("/v1/redfin/agent", {"agent_id": agent_id, "url": url})
103
+ render(data, fmt, fields)
104
+
105
+
106
+ @app.command()
107
+ def autocomplete(
108
+ query: str = typer.Argument(..., help="Partial location — city, ZIP, address, neighborhood"),
109
+ fmt: str = FMT,
110
+ fields: str | None = FIELDS,
111
+ ) -> None:
112
+ """Resolve a search term to Redfin regions/addresses."""
113
+ data = api_get("/v1/redfin/autocomplete", {"query": query})
114
+ render(data, fmt, fields)
115
+
116
+
117
+ @app.command("markets")
118
+ def list_markets(fmt: str = FMT, fields: str | None = FIELDS) -> None:
119
+ """List Redfin coverage regions (US)."""
120
+ data = api_get("/v1/redfin/markets", {})
121
+ render(data, fmt, fields)
@@ -13,6 +13,7 @@ from scrapebadger_cli.commands import (
13
13
  loopnet,
14
14
  realtor,
15
15
  reddit,
16
+ redfin,
16
17
  stream,
17
18
  tiktok,
18
19
  twitter,
@@ -44,6 +45,7 @@ app.add_typer(web.app, name="web", help="Web scraping commands")
44
45
  app.add_typer(google.app, name="google", help="Google scraper commands")
45
46
  app.add_typer(realtor.app, name="realtor", help="Realtor real-estate commands")
46
47
  app.add_typer(loopnet.app, name="loopnet", help="LoopNet commercial real estate commands")
48
+ app.add_typer(redfin.app, name="redfin", help="Redfin real-estate commands")
47
49
  app.command()(auth.auth)
48
50
  app.command(name="credits")(auth.credits)
49
51
  app.command(name="logout")(auth.logout)