"""Stine Seed Company scraper — independent family-owned breeder (Adel, IA). Source: ``www.stineseed.com`` — a custom PHP site (NOT WordPress; ``/wp-json/`` 404s). robots.txt returns 404 (none published); the ``/legal/`` page carries only a standard copyright / no-reproduction clause (no anti-automation term — same posture as the other corpus vendors). ``sitemap.xml`` (~499 URLs) lists every live product page, so it is our canonical enumeration source. Stine is the largest privately-owned seed company in the US; it breeds and sells **corn + soybeans** only (no wheat). The catalog is ~58 corn hybrids + ~159 soybean varieties. Two-step ingestion: 1. **Enumerate** the current catalog from ``sitemap.xml``. A product *detail* URL has the shape ``/{crop}/traits/{trait-slug}/{code}/`` (four path segments); the bare ``/{crop}/traits/{trait-slug}/`` landing pages are skipped. This yields exactly the live catalog (58 corn + 159 soy), unlike the comparison ajax endpoint which also returns thousands of discontinued/historical entries. Fallback enumeration (``--enumerate ajax``) hits the comparison ajax fragments: - corn: POST ``/ajax/corn-comparison/filter_products.php`` - soy: POST ``/ajax/soybean-comparison/filter_products.php`` with ``sel1=&sel2=&sel3=`` (empty = all). Each ``
  • `` carries a numeric product id + the canonical detail URL. 2. **Parse the detail page.** Each ``/{crop}/traits/{slug}/{code}/`` page server-renders all agronomic data (no JS needed) as ``
    `` → ``