Skip to main content

fossick

fossick covers the web-interaction stack that keeps coming up in Python and agent workflows: private local search, reading any page from a static blog to a JS-heavy SPA behind bot detection, and direct Chrome automation for authenticated sites, form filling, and multi-step flows.

The modules compose naturally. search() finds URLs; fetch() reads them — handling JavaScript rendering and anti-bot evasion automatically. For YouTube, arXiv papers, or GitHub repos, dedicated readers return structured data. When the page requires a real login session or interactive interaction, cdp_connect() attaches to a running Chrome browser: pg.snapshot() hands an agent a compact map of the page and pg.fill_form() / pg.act() drive it.

Install

uv add fossick

Text/image/news search work out of the box (no Docker). JS rendering, stealthy fetching, and google() use a bundled headless browser.

Search

search() runs a metasearch through ddgs, aggregating many backends (Bing, Brave, DuckDuckGo, Startpage, Mojeek, Wikipedia, …) — no API key, no Docker. images(), news(), and videos() return the corresponding media.

For real Google ranking when you specifically need it, google() uses a stealth browser to bypass the JavaScript/bot wall that blocks plain-HTTP scraping. Every result is a plain dict, and all functions share a local TTL cache so repeated queries return instantly.

results = search('fasthtml python web framework', n=5)
for r in results: print(r['title'], r['href'])

Fetch and read

fetch() returns a page dict with the raw HTML, parsed JSON if the response was JSON, and any XHR calls the page made. to_md() converts HTML to clean markdown, optionally narrowing to a CSS selector first. Pass heavy=True for JavaScript-rendered pages or stealthy=True for sites with anti-bot detection.

fossick also pulls transcripts and metadata from YouTube, papers and PDFs from arXiv, and files from GitHub repos.

Pass auto=True to let fetch() escalate on its own — plain HTTP first, then a headless browser, then the stealth fetcher, then the logged-in debug Chrome — stopping at the first response that isn’t a bot wall (the winning tier is on page.tier). Pass session=True to route the fetch through your persistent debug Chrome so it reuses that browser’s logged-in cookies — read authenticated pages with no login code.

# extract just the lead paragraphs — no nav, ads, or sidebars
page = fetch('https://en.wikipedia.org/wiki/Web_scraping', verify=False)
print(to_md(page, sel='.mw-parser-output > p')[:400])
[2026-06-22 20:32:21] INFO: Fetched (200) <GET https://en.wikipedia.org/wiki/Web_scraping> (referer: https://www.google.com/)

crawl() follows links from a start URL, returning a list of Page dicts — useful for documentation sites, blogs, and any multi-page content.

pages = crawl('https://docs.python.org/3/library/functions.html',
              follow_sel='a.reference.internal', same_domain=True, max_pages=3, verify=False)
print(f'{len(pages)} pages crawled')
[2026-06-22 20:32:23] INFO: Fetched (200) <GET https://docs.python.org/3/library/functions.html> (referer: https://www.google.com/)
[2026-06-22 20:32:23] INFO: Fetched (200) <GET https://docs.python.org/3/reference/datamodel.html#object.__abs__> (referer: https://www.google.com/)
[2026-06-22 20:32:23] INFO: Fetched (200) <GET https://docs.python.org/3/glossary.html#term-asynchronous-iterator> (referer: https://www.google.com/)

3 pages crawled

fetch_all() fetches multiple URLs in parallel — faster than sequential fetch() calls.

urls = ['https://httpbin.org/get', 'https://httpbin.org/status/200', 'https://httpbin.org/json']
pages = fetch_all(urls, verify=False)
print([p.status for p in pages])
[2026-06-22 20:32:26] INFO: Fetched (503) <GET https://httpbin.org/json> (referer: https://www.google.com/)
[2026-06-22 20:32:26] INFO: Fetched (503) <GET https://httpbin.org/get> (referer: https://www.google.com/)
[2026-06-22 20:32:26] INFO: Fetched (503) <GET https://httpbin.org/status/200> (referer: https://www.google.com/)

[503, 503, 503]

research() closes the loop from question to answer: it searches, reads the top results in parallel (auto-escalating past bot walls), and returns one cited markdown corpus — {query, sources, digest} — ready to hand to an LLM.

notes = research('retrieval augmented generation best practices', n=5)
print(notes['digest'][:500])          # cited markdown, one ## section per source
print([s['href'] for s in notes['sources']])

read_arxiv() fetches paper metadata and converts the full PDF to markdown. Pass an arxiv ID, abstract URL, or PDF URL. The PDF is saved to save_dir; results are cached in-process.

paper = read_arxiv('2306.14881', save_dir='.', verify=False)
print(paper['title'])
print()
print(paper['summary'][:400])
Modeling the molecular gas content and CO-to-H2 conversion factors in low-metallicity star-forming dwarf galaxies

Low-metallicity dwarf galaxies often show no or little CO emission, despite the intense star formation observed in local samples. Both simulations and resolved observations indicate that molecular gas in low-metallicity galaxies may reside in small dense clumps, surrounded by a substantial amount of more diffuse gas, not traced by CO. Constraining the relative importance of CO-bright versus CO-dar

read_gh_repo() clones or fetches a GitHub repo and returns {path: content} for matched files. read_gh_file() reads a single file from a GitHub blob URL.

files = read_gh_repo('https://github.com/vedicreader/kosha', globs=('README*',))
for path, content in files.items():
    print(path.split('/')[-1], f'({len(content)} chars)')
README.md (164718 chars)
txt = read_gh_file('https://github.com/vedicreader/kosha/blob/main/pyproject.toml')
print(txt[:300])
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "koshas"
dynamic = ["version"]
description = "kosha (कोश) — a treasury of your repo and environment context for coding agents. FTS5 + vector search + call graph, no LLMs required."
readme = "README.md"
requir

search_yt() searches YouTube and returns metadata for each result. read_yt() fetches the full English transcript and metadata for a known video URL.

hits = search_yt('3blue1brown neural networks', n=3)
for h in hits: print(h['title'], '\n  ', h['url'])
But what is a neural network? | Deep learning chapter 1 
   https://www.youtube.com/watch?v=aircAruvnKk
Gradient descent, how neural networks learn | Deep Learning Chapter 2 
   https://www.youtube.com/watch?v=IHZwWFHWa-w
Backpropagation, intuitively | Deep Learning Chapter 3 
   https://www.youtube.com/watch?v=Ilg3gGewQ5U
video = read_yt('https://www.youtube.com/watch?v=aircAruvnKk')
print(video['title'])
print(video['source'][:300])
But what is a neural network? | Deep learning chapter 1
[Music] This is a three. It's sloppily written and rendered at an extremely low resolution of 28x 28 pixels. But your brain has no trouble recognizing it as a three. And I want you to take a moment to appreciate how crazy it is that brains can do this so effortlessly. I mean this, this, and this are
path = download_yt('https://www.youtube.com/watch?v=aircAruvnKk',
                   format='audio', save_dir='.')
print(path)  # Path('But what is a neural network.mp3')
WARNING: [youtube] [jsc] Remote components challenge solver script (deno) and NPM package (deno) were skipped. These may be required to solve JS challenges. You can enable these downloads with  --remote-components ejs:github  (recommended) or  --remote-components ejs:npm , respectively. For more information and alternatives, refer to  https://github.com/yt-dlp/yt-dlp/wiki/EJS
WARNING: [youtube] aircAruvnKk: n challenge solving failed: Some formats may be missing. Ensure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to  https://github.com/yt-dlp/yt-dlp/wiki/EJS

                                                          But what is a neural network? | Deep learning chapter 1.mp3

url2nb() converts any URL — HTML page, arXiv paper, or PDF — to a Jupyter notebook. pdf2nb() converts a PDF (local path or URL) to a notebook where each page becomes a markdown cell with an empty code cell below for annotations.

nb = url2nb('https://squiddev.medium.com/continuing-continuations-cps-in-python-47bba90c8d1e', verify=False)
print(nb)   # Path('continuing-continuations-cps-in-python-47bba90c8d1e.ipynb')
[2026-06-22 20:37:55] INFO: Fetched (200) <GET https://squiddev.medium.com/continuing-continuations-cps-in-python-47bba90c8d1e> (referer: https://www.google.com/)

continuing-continuations-cps-in-python-47bba90c8d1.ipynb
nb = pdf2nb('https://selfdeterminationtheory.org/SDT/documents/2000_RyanDeci_SDT.pdf', 'sdt.ipynb', verify=False)
print(nb)   # Path('/path/to/sdt.ipynb')
[2026-06-22 20:37:57] INFO: Fetched (200) <GET https://selfdeterminationtheory.org/SDT/documents/2000_RyanDeci_SDT.pdf> (referer: https://www.google.com/)

/Users/71293/code/personal/orgs/fossick/nbs/sdt.ipynb

Discover hidden APIs

Most modern sites serve their data through undocumented JSON APIs rather than HTML. find_xhr() visits a page with a headless browser and captures every network call the browser makes. paginate_api() replays the request across all pages and collects the results.

For sites behind a login, pass find_xhr(url, session=True) to capture the calls through your authenticated debug Chrome. Each result carries a capture you can hand to replay_xhr(), which re-issues the request as a fast plain-HTTP call — reusing the browser’s cookies — turning any logged-in site’s internal API into a data feed.

posts = paginate_api(
    'https://jsonplaceholder.typicode.com/posts',
    payload={'_page': 1, '_limit': 10},
    page_field='_page',
    size_field='_limit',
    method='GET',
)
print(f'{len(posts)} posts collected')
print(posts[0]['title'])
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=1&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=2&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=3&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=4&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=5&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=6&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=7&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=8&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=9&_limit=10> (referer: https://www.google.com/)
[2026-05-28 16:37:16] INFO: Fetched (200) <GET https://jsonplaceholder.typicode.com/posts?_page=10&_limit=10> (referer: https://www.google.com/)

100 posts collected
sunt aut facere repellat provident occaecati excepturi optio reprehenderit
# on JavaScript-heavy sites, intercept the hidden API with a headless browser
# Woolworths uses a GraphQL endpoint — find_xhr captures whatever calls the page makes
apis = find_xhr('https://www.woolworths.com.au/shop/browse/fruit-veg', pattern='*woolworths.com.au/graphql*')
print(f'{len(apis)} GraphQL calls captured')
for a in apis:
    data = a.get('data', {}).get('data', a.get('data', {}))
    print(a['url'], list(data.keys()) if isinstance(data, dict) else type(data).__name__)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/shop/browse/fruit-veg> (referer: https://www.google.com/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/settings> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/api/ui/v2/bootstrap> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (201) <GET https://www.woolworths.com.au/ZbnWGh/bzsy/4o7V/Z91V/IVtmZUtEk/z1D9kLGuuLOkth/GBAqNwE/CCVe/VHhbPWMB> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/auth/heartbeat> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/Shop/DynamicContent2Panel?scheduleKey=/shop/browse/fruit-veg-bottom> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/akam/13/pixel_7c8f4533> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/PiesCategoriesWithSpecials> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/CarouselProducts> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://dpm.demdex.net/id?d_visid_ver=5.5.0&d_fieldgroup=AAM&d_rtbd=json&d_ver=2&d_orgid=4353388057AC8D357F000101%40AdobeOrg&d_nsid=0&d_mid=79911006971859101769087842756079938574&ts=1779950011997> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://woolworthsfoodgroup.tt.omtrdc.net/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.1> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://woolworthsfoodgroup.tt.omtrdc.net/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.1> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://c.go-mpulse.net/api/config.json?key=LUX5F-TAXLZ-RZV9P-BT522-JCQBY&d=www.woolworths.com.au&t=5933167&v=1.792.80&sl=0&si=1af4e374-018a-4eb6-a2cd-9036acda867a-tfqi7v&plugins=AK,ConfigOverride,Continuity,PageParams,AutoXHR,SPA,History,Angular,Backbone,Ember,RT,PaintTiming,NavigationTiming,ResourceTiming,Memory,Akamai,EventTiming,BFCache,LOGN&acao=&ak.ai=249936> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://cdn0.woolworths.media/wowssr/assets/tga-sku.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (201) <GET https://www.woolworths.com.au/ZbnWGh/bzsy/4o7V/Z91V/IVtmZUtEk/z1D9kLGuuLOkth/GBAqNwE/CCVe/VHhbPWMB> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/browse/category> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/shop/__embedded/browse/fruit-veg?HasTobaccoItems=false> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://cdn0.woolworths.media/wowssr/syd2/a10/browser/assets/navigation/chevron-right.svg> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://cdn0.woolworths.media/wowssr/syd2/a10/browser/assets/navigation/chevron-right.svg> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://api.woolworthsrewards.com.au/cx/nhp/availability/offers/v1/check/adType> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://ct.pinterest.com/user/?event=viewcategory&ed=%7B%22page_name%22%3A%22ww-sm%3Ashop%3Abrowse%3Afruit-veg%22%2C%22page_type%22%3A%22Browse%22%2C%22event%22%3A%22category_view%22%7D&tid=2614249904607&cb=1779950013056&dep=2%2CPAGE_LOAD> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://ct.pinterest.com/user/?event=viewcategory&ed=%7B%22page_name%22%3A%22ww-sm%3Ashop%3Abrowse%3Afruit-veg%22%2C%22page_type%22%3A%22Browse%22%2C%22event%22%3A%22category_view%22%7D&tid=2614249904607&cb=1779950013059&dep=5%2CEVENT_TAGS_ABSENT> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://collect-ap-southeast-2.tealiumiq.com/woolworths/main/2/i.gif> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://api.woolworthsrewards.com.au/cx/nhp/availability/offers/v1/check/adType> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://api.woolworthsrewards.com.au/cx/nhp/availability/offers/v1/check/adType> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://api.woolworthsrewards.com.au/cx/nhp/availability/offers/v1/check/adType> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://woolworthsfoodgroup.sc.omtrdc.net/b/ss/wfg-wx-global-prod/1/JS-2.23.0/s02037651164270> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://cdn0.woolworths.media/wowssr/assets/tga-sku.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://ct.pinterest.com/v3/?event=viewcategory&ed=%7B%22page_name%22%3A%22ww-sm%3Ashop%3Abrowse%3Afruit-veg%22%2C%22page_type%22%3A%22Browse%22%2C%22event%22%3A%22category_view%22%7D&tid=2614249904607&cb=1779950013487&dep=5%2CEVENT_TAGS_ABSENT&pd=%7B%22pin_unauth%22%3A%22dWlkPVpERTNabU0yTldVdE1tSmtOUzAwTmpNd0xUa3hOVFV0TnpRek5EWmpPR05qWVRSaw%22%7D&ad=%7B%22loc%22%3A%22https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg%22%2C%22ref%22%3A%22https%3A%2F%2Fwww.google.com%2F%22%2C%22if%22%3Afalse%2C%22sh%22%3A720%2C%22sw%22%3A1280%2C%22mh%22%3A%22948ee93e%22%2C%22is_eu%22%3Afalse%2C%22architecture%22%3A%22x86%22%2C%22bitness%22%3A%2264%22%2C%22brands%22%3A%5B%7B%22brand%22%3A%22Chromium%22%2C%22version%22%3A%22147%22%7D%2C%7B%22brand%22%3A%22Not.A%2FBrand%22%2C%22version%22%3A%228%22%7D%5D%2C%22mobile%22%3Afalse%2C%22model%22%3A%22%22%2C%22platform%22%3A%22macOS%22%2C%22platformVersion%22%3A%2210.15.7%22%2C%22uaFullVersion%22%3A%22147.0.7727.15%22%2C%22ecm_enabled%22%3Atrue%7D> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/PiesCategoriesWithSpecials> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (204) <GET https://analytics.google.com/g/collect?v=2&tid=G-YBVRJYN9JL&gtm=45je65r0h2v878538926za200zd878538926&_p=1779950012256&_gaz=1&gcd=13l3l3l3l1l1&npa=0&dma=0&gdid=dYmQxMT&_eu=AAAAAGA&are=1&cid=1692319501.1779950014&frm=0&lps=1&pscdl=noapi&rcb=11&sr=1280x720&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uam=&uamb=0&uap=macOS&uapv=10.15.7&uaw=0&ul=en-gb&gaf=2&_s=1&tag_exp=0~115938466~115938468&sid=1779950013&sct=1&seg=0&dl=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&dr=https%3A%2F%2Fwww.google.com%2F&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&en=page_view&_fv=1&_nsi=1&_ss=2&_ee=1&ep.tealium_event=category_view&ep.cart_value=0&ep.collect_event=true&ep.filter_sort_by=Relevance&ep.tile_id=1%2C2%2C3%2C0%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20%2C21%2C22%2C23%2C24%2C25%2C26%2C27%2C28%2C29%2C30%2C31%2C32%2C33%2C34%2C35%2C36%2C37%2C38%2C39%2C40%2C41%2C42%2C43&ep.tealium_visitor_id=019e6d49c759001da3b4760abd0b05075003306d007e8&ep.site_section=shop%3Abrowse&ep.site_name=ww-sm&ep.pfd_items_in_cart=false&ep.page_type=Browse&ep.page_number=1&ep.item_count=44&ep.item_unavailable_count=44&ep.item_min_days_to_delivery=none%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone&ep.item_max_days_to_delivery=none%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone%2Cnone&epn.first_contentful_paint_all=612&epn.first_contentful_paint_first=612&epn.first_paint_all=528&epn.first_paint_first=528&up.store_id=3221&tfd=2993> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (204) <GET https://analytics.google.com/g/collect?v=2&tid=G-YBVRJYN9JL&gtm=45je65r0h2v878538926za200zd878538926&_p=1779950012256&gcd=13l3l3l3l1l1&npa=0&dma=0&gdid=dYmQxMT&_eu=AAAAAGQ&are=1&cid=1692319501.1779950014&frm=0&lps=1&pscdl=noapi&rcb=11&sr=1280x720&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uam=&uamb=0&uap=macOS&uapv=10.15.7&uaw=0&ul=en-gb&gaf=2&_s=2&tag_exp=0~115938466~115938468&sid=1779950013&sct=1&seg=0&dl=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&dr=https%3A%2F%2Fwww.google.com%2F&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&tfd=2997> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (204) <GET https://bat.bing.com/p/insights/c/k> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/apis/ui/products/829107,381923,120080,139238,259450,265225,187314,154340,262783,134681,702151,54899,318163,134034,524336,318290,210687,193753,139645,139897?excludeUnavailable=true> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/graphql> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com/rmkt/collect/969624659/?random=1779950014085&cv=11&fst=1779950014085&fmt=8&bg=ffffff&guid=ON&async=1&en=gtag.config&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&data=event%3Dgtag.config&gcp=5> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com/rmkt/collect/706996958/?random=1779950014157&cv=11&fst=1779950014157&fmt=8&bg=ffffff&guid=ON&async=1&en=gtag.config&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=17&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&_tu=IA&data=event%3Dgtag.config&gcp=5> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://securepubads.g.doubleclick.net/gampad/ads?pvsid=6705090101095288&correlator=2894177363389820&eid=31097658%2C31098733%2C31065644%2C31087490%2C95391587&output=ldjh&gdfp_req=1&vrg=202605210101&ptt=17&impl=fif&iu_parts=22073989984%2Cwoolworths%2Cfruit-veg&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=1600x200&ifi=1&dids=ad-unit-496500&adfs=2652548239&sfv=1-0-45&sc=1&cookie_enabled=1&abxe=1&dt=1779950014226&lmt=1779950014&adxs=57&adys=221&biw=1280&bih=720&scr_x=0&scr_y=0&btvi=0&ucis=1&oid=2&u_his=2&u_h=720&u_w=1280&u_ah=720&u_aw=1280&u_cd=24&u_sd=2&u_tz=600&dmc=32&bc=31&nvt=1&uach=WyJtYWNPUyIsIjEwLjE1LjciLCJ4ODYiLCIiLCIxNDcuMC43NzI3LjE1IixudWxsLDAsbnVsbCwiNjQiLFtbIkNocm9taXVtIiwiMTQ3LjAuNzcyNy4xNSJdLFsiTm90LkEvQnJhbmQiLCI4LjAuMC4wIl1dLDBd&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&vis=1&psz=1167x0&msz=1167x0&fws=4&ohw=1280&dlt=1779950011072&idt=3115&prev_scp=InventoryType%3DBanner&adks=3579162148&frm=20&eoidce=1&pgls=CAk.~CAo.> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com/ccm/collect?rcb=1&frm=0&auid=1550109597.1779950014&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&en=page_view&dr=www.google.com&dl=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&scrsrc=www.googletagmanager.com&lps=1&rnd=295323522.1779950014&navt=n&npa=0&did=dYmQxMT&gdid=dYmQxMT&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&apve=1&apvf=f&apvc=1&tids=AW-969624659&tid=AW-969624659&tft=1779950014102&tfd=3358> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com/ccm/collect?rcb=18&frm=0&auid=1550109597.1779950014&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&en=page_view&dr=www.google.com&dl=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&scrsrc=www.googletagmanager.com&lps=1&rnd=295323522.1779950014&navt=n&npa=0&gdid=dYmQxMT&gtm=45fe65r0h2v9181639601za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118689382&apve=1&apvf=f&apvc=0&tids=DC-8348316&tid=DC-8348316&tft=1779950014133&tfd=3389> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com/ccm/collect?rcb=17&frm=0&auid=1550109597.1779950014&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&en=page_view&dr=www.google.com&dl=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&scrsrc=www.googletagmanager.com&lps=1&rnd=295323522.1779950014&navt=n&npa=0&did=dYmQxMT&gdid=dYmQxMT&_tu=IA&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&apve=1&apvf=f&apvc=0&tids=AW-706996958&tid=AW-706996958&tft=1779950014170&tfd=3426> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://securepubads.g.doubleclick.net/gampad/ads?pvsid=6705090101095288&correlator=2894177363389820&eid=31097658%2C31098733%2C31065644%2C31087490%2C95391587&output=ldjh&gdfp_req=1&vrg=202605210101&ptt=17&impl=fif&iu_parts=22073989984%2Ccontent-card%2Cfruit-veg&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=320x50&fluid=height&ifi=2&dids=ad-unit-1952885819&adfs=208333102&sfv=1-0-45&sc=1&cookie_enabled=1&abxe=1&dt=1779950014233&lmt=1779950014&adxs=56&adys=3517&biw=1280&bih=720&scr_x=0&scr_y=0&btvi=1&ucis=2&oid=2&u_his=2&u_h=720&u_w=1280&u_ah=720&u_aw=1280&u_cd=24&u_sd=2&u_tz=600&dmc=32&bc=31&nvt=1&uach=WyJtYWNPUyIsIjEwLjE1LjciLCJ4ODYiLCIiLCIxNDcuMC43NzI3LjE1IixudWxsLDAsbnVsbCwiNjQiLFtbIkNocm9taXVtIiwiMTQ3LjAuNzcyNy4xNSJdLFsiTm90LkEvQnJhbmQiLCI4LjAuMC4wIl1dLDBd&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&vis=1&psz=224x392&msz=224x392&fws=4&ohw=1280&dlt=1779950011072&idt=3115&prev_scp=InventoryType%3DContent%2520Card&adks=1961169011&frm=20&eoidce=1&pgls=CAk.~CAo.> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.googleadservices.com/pagead/set_partitioned_cookie?rcb=1&frm=0&apvc=1&auid=1550109597.1779950014&dt=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&tid=AW-969624659&en=page_view&ref=www.google.com&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&scrsrc=www.googletagmanager.com&lps=1&rnd=295323522.1779950014&navt=n&npa=0&did=dYmQxMT&gdid=dYmQxMT&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&tft=1779950014091&tfd=3347&apve=1&apvf=f> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.googleadservices.com/pagead/conversion/969624659/?random=1779950014099&cv=11&fst=1779950014099&fmt=7&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=1&label=c7avCOOr79EBENOYrc4D&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&gcl_ctr=1~0~0~0&data=event%3Dconversion&category=acrcp_v1_512> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.googleadservices.com/pagead/conversion/706996958/?random=1779950014167&cv=11&fst=1779950014167&fmt=7&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=17&label=oQFKCJCy0dQBEN7Vj9EC&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&ec_mode=a&gcl_ctr=2~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&em=tv.1> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://acs.woolworths.com.au/rest/v1/delivery?client=woolworthsfoodgroup&sessionId=6d7dd35c357c4bc5899443d02236000a&version=2.10.2> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Response body is unavailable for redirect responses
[2026-05-28 16:34:05] INFO: Fetched (302) <GET https://ad.doubleclick.net/activity;src=8348316;type=supcat;cat=supcfv;rcb=18;ord=7098498947355;npa=0;auiddc=1550109597.1779950014;u4=%2Fshop%2Fbrowse%2Ffruit-veg;u9=381923%2C785544%2C948491%2C%2C948511%2C133211%2C134034%2C141410%2C105919%2C120080%2C144329%2C781403%2C781401%2C948507%2C208895%2C157649%2C134681%2C137130%2C135306%2C170225%2C147071%2C135344%2C144607%2C829107%2C144497%2C130935%2C135369%2C165262%2C187314%2C169067%2C259450%2C149620%2C137102%2C155003%2C154340%2C138801%2C169438%2C259514%2C524322%2C267084%2C147603%2C149864%2C144336%2C139238;u10=%2Fshop%2Fproductdetails%2F381923%2Fkanzi-apple%2C%2Fshop%2Fproductdetails%2F785544%2Fkanzi-apple-punnet%2C%2Fshop%2Fproductdetails%2F948491%2Fgourmet-garden-cold-blend-pastes-garlic%2C%2Fshop%2Fproductdetails%2Fundefined%2Fundefined%2C%2Fshop%2Fproductdetails%2F948511%2Fgourmet-garden-paste-ginger%2C%2Fshop%2Fproductdetails%2F133211%2Fcavendish-bananas%2C%2Fshop%2Fproductdetails%2F134034%2Fgourmet-tomato%2C%2Fshop%2Fproductdetails%2F141410%2Fmandarin-imperial%2C%2Fshop%2Fproductdetails%2F105919%2Ffresh-pink-lady-apples%2C%2Fshop%2Fproductdetails%2F120080%2Fhass-avocado%2C%2Fshop%2Fproductdetails%2F144329%2Fonion-brown%2C%2Fshop%2Fproductdetails%2F781403%2Fgourmet-garden-parsley-lightly-dried-sachet%2C%2Fshop%2Fproductdetails%2F781401%2Fgourmet-garden-basil-lightly-dried-sachet%2C%2Fshop%2Fproductdetails%2F948507%2Fgourmet-garden-paste-chilli-mild%2C%2Fshop%2Fproductdetails%2F208895%2Fpotato-white-washed%2C%2Fshop%2Fproductdetails%2F157649%2Feat-later-cavendish-bananas%2C%2Fshop%2Fproductdetails%2F134681%2Ffresh-broccoli%2C%2Fshop%2Fproductdetails%2F137130%2Flebanese-cucumbers%2C%2Fshop%2Fproductdetails%2F135306%2Fred-capsicum%2C%2Fshop%2Fproductdetails%2F170225%2Ffresh-zucchini-green%2C%2Fshop%2Fproductdetails%2F147071%2Fsweet-potato-gold%2C%2Fshop%2Fproductdetails%2F135344%2Fcarrot-fresh%2C%2Fshop%2Fproductdetails%2F144607%2Fstrawberries-punnet%2C%2Fshop%2Fproductdetails%2F829107%2Fmandarin-amorette-seedless%2C%2Fshop%2Fproductdetails%2F144497%2Fonion-red%2C%2Fshop%2Fproductdetails%2F130935%2Ffresh-granny-smith-apples%2C%2Fshop%2Fproductdetails%2F135369%2Fwoolworths-australian-grown-carrots%2C%2Fshop%2Fproductdetails%2F165262%2Fdriscoll-s-raspberries-punnet%2C%2Fshop%2Fproductdetails%2F187314%2Fwoolworths-broccolini-bunch%2C%2Fshop%2Fproductdetails%2F169067%2Fwoolworths-qukes-baby-cucumbers-punnet%2C%2Fshop%2Fproductdetails%2F259450%2Forange-navel%2C%2Fshop%2Fproductdetails%2F149620%2Fwoolworths-cherry-tomatoes-punnet%2C%2Fshop%2Fproductdetails%2F137102%2Fwoolworths-continental-cucumbers%2C%2Fshop%2Fproductdetails%2F155003%2Fapple-royal-gala%2C%2Fshop%2Fproductdetails%2F154340%2Ficeberg-lettuce%2C%2Fshop%2Fproductdetails%2F138801%2Fwhite-seedless-grapes-bag-approx-900g%2C%2Fshop%2Fproductdetails%2F169438%2Ftruss-tomatoes%2C%2Fshop%2Fproductdetails%2F259514%2Flemon-loose%2C%2Fshop%2Fproductdetails%2F524322%2Fwoolworths-baby-leaf-spinach%2C%2Fshop%2Fproductdetails%2F267084%2Fwoolworths-sungold-kiwifruit-gold%2C%2Fshop%2Fproductdetails%2F147603%2Fspring-onion-bunch%2C%2Fshop%2Fproductdetails%2F149864%2Ftomato-roma-red%2C%2Fshop%2Fproductdetails%2F144336%2Fwoolworths-onion-brown-bag%2C%2Fshop%2Fproductdetails%2F139238%2Fkiwi-fruit-green;u11=1.03%2C5.90%2C4.00%2C0.00%2C4.00%2C0.81%2C0.65%2C0.53%2C1.31%2C2.00%2C0.63%2C4.00%2C4.00%2C4.00%2C0.95%2C0.81%2C1.49%2C1.53%2C2.48%2C1.18%2C1.56%2C0.36%2C0.00%2C0.47%2C0.89%2C1.31%2C1.70%2C4.50%2C3.70%2C3.00%2C1.29%2C3.20%2C2.70%2C1.26%2C3.30%2C6.00%2C1.25%2C1.56%2C3.30%2C1.53%2C3.00%2C0.80%2C3.60%2C0.96;gdid=dYmQxMT;uaa=x86;uab=64;uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0;uamb=0;uam=;uap=macOS;uapv=10.15.7;uaw=0;pscdl=noapi;frm=0;_tu=IFA;gtm=45fe65r0h2v9181639601za200zb878538926zd878538926xec;gcd=13l3l3l3l1l1;dma=0;dc_fmt=6;tag_exp=0~115938466~115938469~116701382~118689382;epver=2;dc_random=1779950014_Zyp9TjrtzrtIKjfB1hqW4ZEz6dJUB74mLA;~oref=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg?> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://adservice.google.com/ddm/fls/z/src=8348316;type=supcat;cat=supcfv;rcb=18;ord=7098498947355;npa=0;auiddc=*;u4=%2Fshop%2Fbrowse%2Ffruit-veg;u9=381923%2C785544%2C948491%2C%2C948511%2C133211%2C134034%2C141410%2C105919%2C120080%2C144329%2C781403%2C781401%2C948507%2C208895%2C157649%2C134681%2C137130%2C135306%2C170225%2C147071%2C135344%2C144607%2C829107%2C144497%2C130935%2C135369%2C165262%2C187314%2C169067%2C259450%2C149620%2C137102%2C155003%2C154340%2C138801%2C169438%2C259514%2C524322%2C267084%2C147603%2C149864%2C144336%2C139238;u10=%2Fshop%2Fproductdetails%2F381923%2Fkanzi-apple%2C%2Fshop%2Fproductdetails%2F785544%2Fkanzi-apple-punnet%2C%2Fshop%2Fproductdetails%2F948491%2Fgourmet-garden-cold-blend-pastes-garlic%2C%2Fshop%2Fproductdetails%2Fundefined%2Fundefined%2C%2Fshop%2Fproductdetails%2F948511%2Fgourmet-garden-paste-ginger%2C%2Fshop%2Fproductdetails%2F133211%2Fcavendish-bananas%2C%2Fshop%2Fproductdetails%2F134034%2Fgourmet-tomato%2C%2Fshop%2Fproductdetails%2F141410%2Fmandarin-imperial%2C%2Fshop%2Fproductdetails%2F105919%2Ffresh-pink-lady-apples%2C%2Fshop%2Fproductdetails%2F120080%2Fhass-avocado%2C%2Fshop%2Fproductdetails%2F144329%2Fonion-brown%2C%2Fshop%2Fproductdetails%2F781403%2Fgourmet-garden-parsley-lightly-dried-sachet%2C%2Fshop%2Fproductdetails%2F781401%2Fgourmet-garden-basil-lightly-dried-sachet%2C%2Fshop%2Fproductdetails%2F948507%2Fgourmet-garden-paste-chilli-mild%2C%2Fshop%2Fproductdetails%2F208895%2Fpotato-white-washed%2C%2Fshop%2Fproductdetails%2F157649%2Feat-later-cavendish-bananas%2C%2Fshop%2Fproductdetails%2F134681%2Ffresh-broccoli%2C%2Fshop%2Fproductdetails%2F137130%2Flebanese-cucumbers%2C%2Fshop%2Fproductdetails%2F135306%2Fred-capsicum%2C%2Fshop%2Fproductdetails%2F170225%2Ffresh-zucchini-green%2C%2Fshop%2Fproductdetails%2F147071%2Fsweet-potato-gold%2C%2Fshop%2Fproductdetails%2F135344%2Fcarrot-fresh%2C%2Fshop%2Fproductdetails%2F144607%2Fstrawberries-punnet%2C%2Fshop%2Fproductdetails%2F829107%2Fmandarin-amorette-seedless%2C%2Fshop%2Fproductdetails%2F144497%2Fonion-red%2C%2Fshop%2Fproductdetails%2F130935%2Ffresh-granny-smith-apples%2C%2Fshop%2Fproductdetails%2F135369%2Fwoolworths-australian-grown-carrots%2C%2Fshop%2Fproductdetails%2F165262%2Fdriscoll-s-raspberries-punnet%2C%2Fshop%2Fproductdetails%2F187314%2Fwoolworths-broccolini-bunch%2C%2Fshop%2Fproductdetails%2F169067%2Fwoolworths-qukes-baby-cucumbers-punnet%2C%2Fshop%2Fproductdetails%2F259450%2Forange-navel%2C%2Fshop%2Fproductdetails%2F149620%2Fwoolworths-cherry-tomatoes-punnet%2C%2Fshop%2Fproductdetails%2F137102%2Fwoolworths-continental-cucumbers%2C%2Fshop%2Fproductdetails%2F155003%2Fapple-royal-gala%2C%2Fshop%2Fproductdetails%2F154340%2Ficeberg-lettuce%2C%2Fshop%2Fproductdetails%2F138801%2Fwhite-seedless-grapes-bag-approx-900g%2C%2Fshop%2Fproductdetails%2F169438%2Ftruss-tomatoes%2C%2Fshop%2Fproductdetails%2F259514%2Flemon-loose%2C%2Fshop%2Fproductdetails%2F524322%2Fwoolworths-baby-leaf-spinach%2C%2Fshop%2Fproductdetails%2F267084%2Fwoolworths-sungold-kiwifruit-gold%2C%2Fshop%2Fproductdetails%2F147603%2Fspring-onion-bunch%2C%2Fshop%2Fproductdetails%2F149864%2Ftomato-roma-red%2C%2Fshop%2Fproductdetails%2F144336%2Fwoolworths-onion-brown-bag%2C%2Fshop%2Fproductdetails%2F139238%2Fkiwi-fruit-green;u11=1.03%2C5.90%2C4.00%2C0.00%2C4.00%2C0.81%2C0.65%2C0.53%2C1.31%2C2.00%2C0.63%2C4.00%2C4.00%2C4.00%2C0.95%2C0.81%2C1.49%2C1.53%2C2.48%2C1.18%2C1.56%2C0.36%2C0.00%2C0.47%2C0.89%2C1.31%2C1.70%2C4.50%2C3.70%2C3.00%2C1.29%2C3.20%2C2.70%2C1.26%2C3.30%2C6.00%2C1.25%2C1.56%2C3.30%2C1.53%2C3.00%2C0.80%2C3.60%2C0.96;gdid=dYmQxMT;uaa=x86;uab=64;uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0;uamb=0;uam=;uap=macOS;uapv=10.15.7;uaw=0;pscdl=noapi;frm=0;_tu=IFA;gtm=45fe65r0h2v9181639601za200zb878538926zd878538926xec;gcd=13l3l3l3l1l1;dma=0;dc_fmt=6;tag_exp=0~115938466~115938469~116701382~118689382;epver=2;dc_random=1779950014_Zyp9TjrtzrtIKjfB1hqW4ZEz6dJUB74mLA;~oref=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Response body is unavailable for redirect responses
[2026-05-28 16:34:05] INFO: Fetched (302) <GET https://googleads.g.doubleclick.net/pagead/viewthroughconversion/969624659/?random=1642705173&cv=11&fst=1779950014099&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=1&label=c7avCOOr79EBENOYrc4D&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&gcl_ctr=1~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCJfUsQIIyduxAgjU5rECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZdHJpZ2dlcj1uYXZpZ2F0aW9uLXNvdXJjZVoDCgEBYgMKAQM&cerd=CgTbib4t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhobfHYtttOOJTBc6uSC3s125TuRVBtghkEkbBuRObgtSNn2SWGquExoC7W8&pscrd=IhMIpofOwq7blAMVosiEAB2AIBfGOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUWkkxTktlZlZ2Vmh6Q0NOR1RUdEFDZWFNUjlrNC1XMU5ySktGcUFXWURZUWVZb205bmJDd3oMCAliCAgAEAAYACAA> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Response body is unavailable for redirect responses
[2026-05-28 16:34:05] INFO: Fetched (302) <GET https://www.google.com/pagead/1p-conversion/969624659/?random=1642705173&cv=11&fst=1779950014099&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=1&label=c7avCOOr79EBENOYrc4D&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&gcl_ctr=1~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCJfUsQIIyduxAgjU5rECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZdHJpZ2dlcj1uYXZpZ2F0aW9uLXNvdXJjZVoDCgEBYgMKAQM&cerd=CgTbib4t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhobfHYtttOOJTBc6uSC3s125TuRVBtghkEkbBuRObgtSNn2SWGquExoC7W8&pscrd=IhMIpofOwq7blAMVosiEAB2AIBfGOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUWkkxTktlZlZ2Vmh6Q0NOR1RUdEFDZWFNUjlrNC1XMU5ySktGcUFXWURZUWVZb205bmJDd3oMCAliCAgAEAAYACAA&is_vtc=1&cid=CAQS-QEABaugfaBQnVt35jFlNlcJ0OJ61sjJvZH33IrWyQpfvm286tbikEv7ponCGi9Lbn421fo29MkHQO9kHh0MzvjPJkZm2yRHIrRLRP-BFXqvI3lK7Fm4xWtUs8_SjHGvlkAIDSFXVy2Sv41vUd7Sg8zJT1fFAPyLs36phTGDw-8RyCqLCRGTGPofLSVBiJwSwtBOhd6cpal3vj15YfVeAtmqSN7hnmxozgxsav4tIjOSkhv2C18YL6f5F9Rce5ltXIMU2rsJIR12Q07eMsdu8y8xDrVXWlT0PKJA-CFzhgoBRNvGVx6nImuJjJw9AfwYNEAREHoo5dCXv0c&random=1782424608> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com.au/pagead/1p-conversion/969624659/?random=1642705173&cv=11&fst=1779950014099&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v9207916595za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115616985~115938466~115938469~116701382&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=1&label=c7avCOOr79EBENOYrc4D&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&gcl_ctr=1~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCJfUsQIIyduxAgjU5rECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZdHJpZ2dlcj1uYXZpZ2F0aW9uLXNvdXJjZVoDCgEBYgMKAQM&cerd=CgTbib4t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhobfHYtttOOJTBc6uSC3s125TuRVBtghkEkbBuRObgtSNn2SWGquExoC7W8&is_vtc=1&cid=CAQS-QEABaugfaBQnVt35jFlNlcJ0OJ61sjJvZH33IrWyQpfvm286tbikEv7ponCGi9Lbn421fo29MkHQO9kHh0MzvjPJkZm2yRHIrRLRP-BFXqvI3lK7Fm4xWtUs8_SjHGvlkAIDSFXVy2Sv41vUd7Sg8zJT1fFAPyLs36phTGDw-8RyCqLCRGTGPofLSVBiJwSwtBOhd6cpal3vj15YfVeAtmqSN7hnmxozgxsav4tIjOSkhv2C18YL6f5F9Rce5ltXIMU2rsJIR12Q07eMsdu8y8xDrVXWlT0PKJA-CFzhgoBRNvGVx6nImuJjJw9AfwYNEAREHoo5dCXv0c&random=1782424608&ipr=y&pscrd=IhMIpofOwq7blAMVosiEAB2AIBfGOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUWkkxTktlZlZ2Vmh6Q0NOR1RUdEFDZWFNUjlrNC1XMU5ySktGcUFXWURZUWVZb205bmJDd3oMCAliCAgAEAAYACAAggEacAGIAQGQAQGYAQGyAQcIrMbcARABwgECCAE> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://chatwidget.woolworths.com.au/configs/wowo.json?q=www.woolworths.com.au-1038.0.0-> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Response body is unavailable for redirect responses
[2026-05-28 16:34:05] INFO: Fetched (302) <GET https://googleads.g.doubleclick.net/pagead/viewthroughconversion/706996958/?random=332136726&cv=11&fst=1779950014167&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=17&label=oQFKCJCy0dQBEN7Vj9EC&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&ec_mode=a&gcl_ctr=2~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&em=tv.1&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCMnjsQIIl9SxAgjJ27ECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZbm90LWV2ZW50LXNvdXJjZSwgdHJpZ2dlcloDCgEBYgMKAQM&cerd=CgSg870t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhgU-mr1Suf59DFLqpGm7r6LKinpwUfbF8N6UD3ipqP4Kuo6tvV1wdhoCQHk&pscrd=IhMI8ZPOwq7blAMVUOSEAB03qRUoOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUa0hvYnlFVXcya0pRLVFyY3NxVGk4b1NSeHc5NkUwT2FjclNqZTRNbDYyMmVSbTlURTNiVXoMCAliCAgAEAAYACAA> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Response body is unavailable for redirect responses
[2026-05-28 16:34:05] INFO: Fetched (302) <GET https://www.google.com/pagead/1p-conversion/706996958/?random=332136726&cv=11&fst=1779950014167&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=17&label=oQFKCJCy0dQBEN7Vj9EC&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&ec_mode=a&gcl_ctr=2~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&em=tv.1&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCMnjsQIIl9SxAgjJ27ECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZbm90LWV2ZW50LXNvdXJjZSwgdHJpZ2dlcloDCgEBYgMKAQM&cerd=CgSg870t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhgU-mr1Suf59DFLqpGm7r6LKinpwUfbF8N6UD3ipqP4Kuo6tvV1wdhoCQHk&pscrd=IhMI8ZPOwq7blAMVUOSEAB03qRUoOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUa0hvYnlFVXcya0pRLVFyY3NxVGk4b1NSeHc5NkUwT2FjclNqZTRNbDYyMmVSbTlURTNiVXoMCAliCAgAEAAYACAA&is_vtc=1&cid=CAQS-QEABaugfURudwOH2jnIhzEw6bRGF0rlF3zWBwhW4qKPkDHdBjBaUBrSqdBSS5XlOgRY8TBWEqBaQI9aKZUtUm4vINpnronQ6vZ_j49b89wHWf70lsLPQJ2k7w-Ki4emI20e7dImPAvFpp6R4d7NjxCrBMZs7J-0Gfftm6QCZmquF67HEcUzPFlVVxVlNJtZZ4x_DQEl61YmWJxH9-ikjpxjsIW5DNqhC7_lm0JTuVZi_LkPOK6juqwv5K8aPE4FLXMUKuLm9ODJOXOnZMIlJR2OqE5MbJaX4Flx7xnhRLbo4e7osRuSgqwRnxMBU_VT9TAOG49rVbX64pA&random=796175616> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] ERROR: Error getting page content: Response.body: Protocol error (Network.getResponseBody): No data found for resource with given identifier
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.google.com.au/pagead/1p-conversion/706996958/?random=332136726&cv=11&fst=1779950014167&fmt=8&bg=ffffff&guid=ON&async=1&en=conversion&gtm=45be65r0h2v894961105za200zb878538926zd878538926xec&gcd=13l3l3l3l1l1&dma=0&tag_exp=0~115938466~115938469~116701382~118228215&u_w=1280&u_h=720&url=https%3A%2F%2Fwww.woolworths.com.au%2Fshop%2Fbrowse%2Ffruit-veg&ref=https%3A%2F%2Fwww.google.com%2F&rcb=17&label=oQFKCJCy0dQBEN7Vj9EC&capi=1&gtm_ee=1&frm=0&tiba=Fresh%20Fruit%20%26%20Vegetables%20%7C%20Woolworths&did=dYmQxMT&gdid=dYmQxMT&value=1&hn=www.googleadservices.com&npa=0&pscdl=noapi&auid=1550109597.1779950014&uaa=x86&uab=64&uafvl=Chromium%3B147.0.7727.15%7CNot.A%252FBrand%3B8.0.0.0&uamb=0&uam=&uap=macOS&uapv=10.15.7&uaw=0&ec_mode=a&gcl_ctr=2~0~0~0&data=event%3Dconversion&category=acrcp_v1_512&em=tv.1&ct_cookie_present=false&crd=CLTesQII8t-xAgit4bECCKG4sQIIscGxAgiwwbECCLHDsQIIisWxAgjCybECCLTGsQIIk9qxAgjb3LECCIfbsQII08WxAgjrzLECCO3OsQII1c-xAgj02rECCMnjsQIIl9SxAgjJ27ECCLHhsQIIs-GxAgim3bECCLDesQIIgNuxAkoZbm90LWV2ZW50LXNvdXJjZSwgdHJpZ2dlcloDCgEBYgMKAQM&cerd=CgSg870t&fsk=ChAI8Kza0AYQn--F9POI5p4NEiwAPzTlhgU-mr1Suf59DFLqpGm7r6LKinpwUfbF8N6UD3ipqP4Kuo6tvV1wdhoCQHk&is_vtc=1&cid=CAQS-QEABaugfURudwOH2jnIhzEw6bRGF0rlF3zWBwhW4qKPkDHdBjBaUBrSqdBSS5XlOgRY8TBWEqBaQI9aKZUtUm4vINpnronQ6vZ_j49b89wHWf70lsLPQJ2k7w-Ki4emI20e7dImPAvFpp6R4d7NjxCrBMZs7J-0Gfftm6QCZmquF67HEcUzPFlVVxVlNJtZZ4x_DQEl61YmWJxH9-ikjpxjsIW5DNqhC7_lm0JTuVZi_LkPOK6juqwv5K8aPE4FLXMUKuLm9ODJOXOnZMIlJR2OqE5MbJaX4Flx7xnhRLbo4e7osRuSgqwRnxMBU_VT9TAOG49rVbX64pA&random=796175616&ipr=y&pscrd=IhMI8ZPOwq7blAMVUOSEAB03qRUoOh5odHRwczovL3d3dy53b29sd29ydGhzLmNvbS5hdS9CV0NoRUk4S3phMEFZUXg4TEJ3djdPOTVUekFSSXNBRDBuQWVUa0hvYnlFVXcya0pRLVFyY3NxVGk4b1NSeHc5NkUwT2FjclNqZTRNbDYyMmVSbTlURTNiVXobCAlY6caxAljpxrECWOnGsQJiCAgAEAAYACAAggEacAGIAQGQAQGYAQGyAQcIiaXdARABwgECCAE> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/graphql> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://nebula-cdn.kampyle.com/au/wau/68738/onsite/onsiteData1778571097953.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://nebula-cdn.kampyle.com/au/wau/68738/forms/3725/formData1762328011276_en.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://nebula-cdn.kampyle.com/au/wau/68738/forms/3726/formData1762328029477_en.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://nebula-cdn.kampyle.com/au/wau/68738/forms/7952/formDataV2_1762329178994_en.json> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://analytics-fe.digital-cloud-syd1.medallia.com.au/api/web/events> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://analytics-fe.digital-cloud-syd1.medallia.com.au/api/web/events> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://analytics-fe.digital-cloud-syd1.medallia.com.au/api/web/events> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://ep1.adtrafficquality.google/getconfig/sodar?sv=200&tid=gpt&tv=m202605210101&st=env&sjk=6705090101095288> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://analytics-fe.digital-cloud-syd1.medallia.com.au/api/web/events> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://insight.adsrvr.org/track/realtimeconversion> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (200) <GET https://www.woolworths.com.au/ZbnWGh/bzsy/4o7V/Z91V/IVtmZUtEk/kJD9kLGu/IjwzNwE/HFIm/ImVmBVN0> (referer: https://www.woolworths.com.au/shop/browse/fruit-veg)
[2026-05-28 16:34:05] INFO: Fetched (439) <GET https://dc.services.visualstudio.com/v2/track> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (439) <GET https://dc.services.visualstudio.com/v2/track> (referer: https://www.woolworths.com.au/)
[2026-05-28 16:34:05] INFO: Fetched (439) <GET https://dc.services.visualstudio.com/v2/track> (referer: https://www.woolworths.com.au/)

2 GraphQL calls captured
https://www.woolworths.com.au/graphql ['products']
https://www.woolworths.com.au/graphql ['products']

Browser automation

cdp_connect() attaches to a running Chrome browser over the DevTools Protocol. The browser uses a persistent debug profile so cookies and SSO sessions survive across runs. Log in once to any enterprise or authenticated site; every subsequent call reuses that session.

pg.snapshot() gives an LLM a compact, interactive-elements-only view of the page — one [#id] role "name" line per button, link, and field — far smaller than the full ax_tree(). Act on it with pg.fill_form({label: value}, submit='Sign in'), pg.click_settle(), or the CSS bridges pg.click_sel() / pg.fill_sel(). pg.act([...]) runs a whole declarative flow (goto / fill / click / select / read) in one call, and ax_diff(before, after) shows exactly what an action changed. pg.md() pulls the live, post-JavaScript page straight into fossick’s markdown pipeline. syncy() runs any async CDP call synchronously.

snapshot() re-reads the tree for you, so IDs are always fresh. When you need the raw tree, print the full ax_tree() output — never truncate — and re-read it after each navigation, since backend IDs change.

from fossick.cdp import cdp_connect, syncy

cdp = syncy(cdp_connect())
pg  = syncy(cdp.open_page('https://example.com/login'))

# Compact, agent-ready view — just the actionable elements
print(syncy(pg.snapshot()))

# Fill the form by label and submit — no manual node IDs, waits handled for you
print(syncy(pg.fill_form({'Email': 'user@example.com', 'Password': 'secret'}, submit='Sign in')))

# Or drive a whole flow declaratively, collecting what you read
out = syncy(pg.act([
    ('goto', 'https://example.com/search'),
    ('fill', 'Search', 'web scraping'),
    ('click', 'Search'),
    ('read', '.results')]))
print(out['.results'][:400])

Shopping carts

fossick.shop is the cart layer on top of that browser: an agent finds products, adds them, and — the part that usually goes wrong — knows whether the add worked. There are no per-site selectors to write. Products are found by deriving card boundaries from the page’s own link structure, so the same code reads a Shopify collection, an Amazon results page and a bespoke Rails storefront; where a site has a real cart API (Shopify’s /cart.js) it is used instead of clicking.

Every mutating call reads the cart before and after and reports the evidence: ok=True with how='count', 'subtotal', 'lines' or a confirmation toast. ok=None means the page exposes no cart signal to check against — an agent should never turn that into “added it”. Ambiguity is handed back rather than guessed: an unmatched name raises with the titles that were on offer, and a product needing a size returns need='variant' with the variants that are actually in stock.

from fossick.shop import shop

s = shop('https://members.ceresfairfood.org.au')      # opens in the persistent debug Chrome
s.search('apples')[:2]                                # [{'i': 0, 'title': 'Apples Fuji IPM 500g', 'price': 5.5, ...}]

# add by index or by title; the result says what actually changed in the cart
s.add('Apples Fuji Organic 500g', qty=2)
# {'ok': True, 'how': 'count', 'qty': 2, 'qty_set': '2',
#  'before': {'count': 0, ...}, 'after': {'count': 2, ...}}

s.cart_page()                                         # {'count': 2, 'subtotal': 13.0, 'lines': [...]}
s.set_qty(0, 3); s.remove(0)

Checkout forms are read before they are filled. s.fields() returns every visible input with its label, autocomplete token, current value and <select> options — ground truth, so nothing has to be guessed from a field name. s.fill(profile) maps a plain dict onto them (by autocomplete token first, since that is a spec rather than a hunch), then re-reads the form to report which values actually stuck. It will not press a payment button: submit= accepts a button name, but anything that reads like paying needs confirm=True as well.

s.blockers() names what is standing in the way — cookie-banner, location-required, login-required, captcha — and s.dismiss() clicks through the consent ones. Logging in and choosing a delivery store stay a human’s job, done once; the persistent profile keeps them.

s.goto('https://example.com/checkout')
s.fields()      # [{'i': 7, 'label': 'Suburb', 'autocomplete': 'address-level2', ...}, ...]

s.fill(dict(email='sam@example.com', first_name='Sam', last_name='Nguyen',
            address1='12 Smith St', city='Brunswick', state='Victoria', postcode='3056'))
# {'filled': {'city': {'i': 7, 'label': 'Suburb', 'got': 'Brunswick', 'confirmed': True}, ...},
#  'failed': {}, 'unmatched': []}

s.fill({'12': 'Large'})     # a numeric key sets that fields() index — size, colour, delivery window

s.fill({}, submit='Place order')     # ShopError: looks like it completes a payment — pass confirm=True

Setup — the persistent debug Chrome

fetch(url, session=True) and the CDP tools use a long-lived Chrome with remote debugging on port 9223 — you don’t have to start it yourself. fetch(session=True), cdp_ws(), and cdp_connect() launch one headless on first use, on a persistent profile (~/.cache/fastcdp/cdp-chrome), so cookies and SSO sessions survive across runs.

To log in by hand (Cloudflare / SSO / Anubis) you need a headed window. A running Chrome can’t switch modes, so quit it and relaunch with headless=False — see Managing the debug Chrome in the cdp docs. To keep one always-on at login, install the bundled service file for your OS (chrome_debug.plist for launchd, chrome_debug.service for systemd, chrome_debug_task.xml for Task Scheduler).

CLI

fossick ships a fossick command for shell scripts and agent harnesses that don’t have a Python kernel. All commands accept --as_json to return JSON instead of markdown.

# fetch a page as markdown (--auto escalates plain->heavy->stealthy->session; --session uses the logged-in Chrome)
fossick fetch https://en.wikipedia.org/wiki/Web_scraping --sel '.mw-parser-output > p'

# research: search, then read the top results into one cited markdown corpus
fossick research "retrieval augmented generation best practices" --n 5

# compact, agent-ready accessibility snapshot of a live page in the debug Chrome
fossick ax https://example.com

# web search
fossick search "fasthtml python framework" --n 5

# read an arxiv paper (summary only by default; --source for full text)
fossick read-arxiv 2306.14881

# YouTube transcript
fossick read-yt https://www.youtube.com/watch?v=aircAruvnKk

# search YouTube
fossick search-yt "3blue1brown neural networks" --n 3

# download YouTube audio or video
fossick download-yt https://www.youtube.com/watch?v=aircAruvnKk --format audio

# convert a URL, PDF, or arXiv paper to a Jupyter notebook
fossick url2nb https://arxiv.org/abs/2306.14881

# capture outgoing network requests fired by a page (uses real Chrome session)
fossick calls https://example.com --pattern '*api*' --as_json

# interactive screenshot capture — overlays a button in Chrome, ✓ Done to finish
fossick collect https://example.com --save_dir shots

# click elements to annotate them with AX role + selector; saves labeled screenshot
fossick annotate https://example.com --save_dir shots

# drive a shopping cart — list, add (verified), read the cart. Each call reuses the tab
# the last one left open, so --add acts on the page --search landed you on.
fossick shop https://members.ceresfairfood.org.au --search apples
fossick shop https://members.ceresfairfood.org.au --add 'Apples Fuji Organic 500g' --qty 2
fossick shop https://members.ceresfairfood.org.au --cart

# install SKILL.md to .agents/skills/fossick/ and .claude/skills/fossick/
fossick install
from fossick.cdp import cdp_setup, cdp_connect, syncy, _debug_running
# Start a persistent debug Chrome you can log into; fetch(url, session=True) reuses it afterwards.
if _debug_running(9223):                       # a headless instance may already be running
    cdp = syncy(cdp_connect(port=9223))
    try: syncy(cdp.quit())                     # quit() drops the socket -> ConnectionClosedOK
    except Exception: pass
syncy(cdp_setup(9223, headless=False))         # headed: log in by hand, then use session=True

MCP server

fossick-mcp exposes the whole toolkit over the Model Context Protocol, so Claude Code, Claude Desktop, Codex, and any other MCP client can drive fossick directly — search, fetch, readers, hidden-API discovery, the logged-in debug Chrome (browse / page_* tools), and shopping carts (shop_open, shop_search, shop_products, shop_add, shop_cart, shop_line, shop_fields, shop_fill, shop_dismiss).

uv add 'fossick'        # or: pip install 'fossick'

Claude Code

claude mcp add fossick -- uvx --from 'fossick' fossick-mcp

Codex (~/.codex/config.toml)

[mcp_servers.fossick]
command = "uvx"
args = ["--from", "fossick", "fossick-mcp"]

Claude Desktop (claude_desktop_config.json)

{"mcpServers": {"fossick": {"command": "uvx", "args": ["--from", "fossick", "fossick-mcp"]}}}

The server speaks stdio by default (fossick-mcp --http for Streamable HTTP). Tools mirror the Python/CLI API — see the mcp docs for the full list.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fossick-0.1.3.tar.gz (102.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fossick-0.1.3-py3-none-any.whl (86.5 kB view details)

Uploaded Python 3

File details

Details for the file fossick-0.1.3.tar.gz.

File metadata

  • Download URL: fossick-0.1.3.tar.gz
  • Upload date:
  • Size: 102.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for fossick-0.1.3.tar.gz
Algorithm Hash digest
SHA256 090e090f85332ba85ac2ef0ee723b9ed4dd6d3fe169b7bc889798a2b48893be0
MD5 a997eaa92317be29daaae85e42a7fd85
BLAKE2b-256 12d7dc12bc3eb4b167e7adc360892ce8ed1abfaa53e09670da5ae7ad09a16427

See more details on using hashes here.

File details

Details for the file fossick-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: fossick-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 86.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for fossick-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 86b0a1a4f899345edbf04eb742cc3a461e92f1125fff95038ef0f861266daac3
MD5 bc923b1a9237ce0970b66546959d7d7d
BLAKE2b-256 bc720109c7a9ea80b927bfd74bc5b6c2b789a87f0a37c94227309a86d4bb752c

See more details on using hashes here.

Release history Release notifications | RSS feed

0.1.17

2 files

0.1.16

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

This release

0.1.3 This release

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

0.0.15

2 files

0.0.14

2 files

0.0.13

2 files

0.0.12

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page