trawcsy
Tiny, zero-dependency crawler. Fetch, parse, crawl, sitemap, store, GUI. All stdlib.
pip install trawcsy
trawcsy https://example.com # shorthand — JSONL to stdout
trawcsy page https://x.com -o data # to file
trawcsy page https://x.com -f text # plain text
trawcsy page https://x.com -f json # JSON array
trawcsy crawl https://site.com --depth 2 # recursive (concurrent)
trawcsy crawl @urls.txt # URLs from file
trawcsy sitemap https://site.com/xml # from sitemap
trawcsy gui # graphical interface
trawcsy cat < data.jsonl # read + print text
Library
from trawcsy import (
fetch, parse, parse_html, # single page
save, load, dumps, loads, # JSONL
dumps_json_array, save_json_array, # JSON array
crawl, crawl_urls, # crawling
parse_sitemap, # sitemaps
)
# single page
page = parse("https://example.com")
print(page.title, len(page.text))
# recursive crawl (concurrent, configurable workers)
pages = crawl("https://docs.python.org/3/", depth=2, max_pages=10, workers=8)
# fetch URL list concurrently
pages = crawl_urls(["https://a.com", "https://b.com"], workers=5)
# from sitemap
urls = parse_sitemap("https://site.com/sitemap.xml")
for url in urls[:10]:
save(parse(url), path="crawl.jsonl")
# JSON array output
save_json_array(pages, path="output.json")
# pipe-friendly
save(page) # → stdout JSONL
for p in load("data.jsonl"):
print(p.text[:200])
Page fields
| Field | Type | Content |
|---|---|---|
.url |
str |
Source URL |
.title |
str |
<title> text |
.text |
str |
Visible page text (block-separated by newlines) |
.links |
list[dict] |
{"href": str, "text": str} |
.tables |
list[dict] |
{"caption": str, "headers": list, "rows": list[list]} |
.lists |
list[dict] |
`{"tag": "ul" |
.code |
list[dict] |
{"lang": str, "body": str} |
.meta |
dict |
Meta name/OG property → content |
CLI
trawcsy https://example.com # shorthand JSONL to stdout
trawcsy page https://x.com -o data # to file
trawcsy page https://x.com -f text # plain text
trawcsy page https://x.com -f json # JSON array
trawcsy crawl https://site.com --depth 2 --workers 10
trawcsy crawl @urls.txt # read URLs from file
trawcsy sitemap https://site.com/xml
trawcsy gui # tkinter GUI
trawcsy cat < data.jsonl # read + print
trawcsy completion bash|zsh # shell completion
trawcsy --version # → trawcsy 0.3.0
Options: --rate SEC, --timeout SEC, --workers N
Why trawcsy
- Zero dependencies — stdlib only (urllib, html.parser, json, xml, tkinter, concurrent)
- ~17KB wheel — installs in <1 second
- Concurrent — thread pool crawl speeds up multi-page fetches
- 80 tests — CLI, parser edge cases, concurrent crawl, URL normalization, JSON array, sitemap
- Modular — import only what you need
- Composable — stdin/stdout JSONL/JSON, works with any pipeline
- GUI included —
trawcsy guifor interactive browsing
License
MIT
Metadata
Release files for trawcsy 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| trawcsy-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / trawcsy-0.3.0-py3-none-any.whl
| Download URL | trawcsy-0.3.0-py3-none-any.whl |
|---|---|
| Size | 18.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
35e3492ae55f4f9e4f688bc1e0322a5e9af3fd47104a85fb14814543c85343f5
|
|
BLAKE2b-256 checksum How to use checksums |
4e120f21367c6f6aedf71fa8188555201205b93a55a8c131a8320f2de47a8900
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.6
|
Security for trawcsy 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.