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.
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/PKG-INFO +8 -1
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/README.md +7 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/pyproject.toml +1 -1
- scrapebadger_cli-0.3.0/src/scrapebadger_cli/commands/redfin.py +121 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/main.py +2 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/.gitignore +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/__init__.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/client.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/__init__.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/amazon.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/auth.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/ebay.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/google.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/idealista.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/immobiliare.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/leboncoin.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/loopnet.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/realtor.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/reddit.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/stream.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/tiktok.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/twitter.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/vinted.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/web.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/youtube.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/zillow.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/config.py +0 -0
- {scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/output.py +0 -0
- {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.
|
|
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
|
|
@@ -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)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/idealista.py
RENAMED
|
File without changes
|
{scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/immobiliare.py
RENAMED
|
File without changes
|
{scrapebadger_cli-0.2.1 → scrapebadger_cli-0.3.0}/src/scrapebadger_cli/commands/leboncoin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|