Author: Xavier Fok

  • Proxy Patterns for App Store Position Tracking (2026)

    App store position tracking without proxies is broken by design. The App Store and Google Play serve different rankings based on country, device type, and even carrier — and if your scraper runs from a single datacenter IP, you’re getting one slice of a highly localized picture. Getting this right in 2026 means matching your proxy infrastructure to the way app store crawlers get blocked, rate-limited, and fingerprinted.

    Why App Store Ranking Data Is Harder to Collect Than It Looks

    Apple and Google both serve ranking data dynamically. A top-10 result for “expense tracker” in the US App Store differs from the same query in Singapore or Germany — and those differences update hourly during peak periods. The naive approach (curl from an AWS instance) gets you either a CAPTCHA wall or stale cached data within minutes.

    The core problem is that app store endpoints use a combination of IP reputation scoring, request-rate fingerprinting, and geo-validation. Datacenter IPs are flagged almost immediately. Even well-known residential proxy pools with large subnets get rate-limited once they show consistent scraping patterns.

    This is a structural problem, not a solvable-with-headers one. The fix is at the proxy layer, not the request layer.

    Proxy Type Selection: Mobile First, Residential Second

    For app store rank tracking specifically, mobile proxies outperform residential on every dimension that matters:

    Proxy Type Trust Score Geo Accuracy Cost/GB Block Rate (App Stores)
    Datacenter Low Medium $0.50-1 Very high
    Residential Medium High $3-8 Medium
    Mobile (4G/5G) Very high Very high $8-20 Low
    ISP (static res.) Medium-high High $4-10 Medium

    Mobile IPs are assigned by carriers and rotate through CGNAT pools — the same infrastructure a real iPhone uses to browse the App Store. That’s exactly the signal app store anti-bot systems look for. The same logic applies to proxy selection for ticket bots, where trust-tier matching between proxy and platform determines whether you get real data or a block.

    For rank tracking at scale across 10+ countries, you need country-matched mobile IPs. A Singapore mobile IP hitting the SG App Store will behave like a local user. A US residential IP doing the same thing may work but will show higher block rates over time, particularly for keyword search ranking endpoints.

    Rotation Strategy: Request-Level vs. Session-Level

    How you rotate matters as much as which proxy type you use. App store ranking checks fall into two patterns:

    Request-level rotation (new IP per request) works for:

    • Top charts by category
    • Featured app lists
    • Search result pages (non-personalized)

    Session-level rotation (same IP for a sequence of requests) works for:

    • Keyword ranking checks that require simulating a search + scroll + click flow
    • A/B test visibility sampling
    • Store listing page reads with embedded review counts

    For session-level work, you want sticky sessions of 2-5 minutes per IP. Most mobile proxy providers support session tokens or sticky endpoints — use them. If you’re running parallel country checks, assign one sticky session per country per keyword batch.

    This is the same session discipline that matters in proxy patterns for brand protection monitoring, where per-platform session consistency prevents false negatives from mid-session IP switches.

    Building a Rank Tracking Scraper: Minimal Working Config

    A basic Google Play rank tracker in Python using a rotating mobile proxy:

    import httpx
    import time
    
    PROXY = "http://user-country-us-session-kw001:pass@mobile.proxypool.io:8080"
    
    def check_play_rank(keyword: str, app_id: str) -> int | None:
        url = "https://play.google.com/store/search"
        params = {"q": keyword, "c": "apps", "hl": "en", "gl": "US"}
        headers = {
            "User-Agent": "Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36",
            "Accept-Language": "en-US,en;q=0.9",
        }
        try:
            r = httpx.get(url, params=params, headers=headers,
                          proxies={"https://": PROXY}, timeout=15)
            r.raise_for_status()
            # parse position of app_id from result HTML
            return parse_rank(r.text, app_id)
        except httpx.HTTPStatusError as e:
            if e.response.status_code == 429:
                time.sleep(30)
            return None

    Key decisions in this config: Android UA paired with a mobile proxy (consistent fingerprint), session token in the proxy auth string for sticky behavior per keyword, and explicit 429 handling before retry. Running this with a datacenter proxy and a desktop Chrome UA is a common mismatch that inflates your block rate for no gain.

    Multi-Country Tracking: Geo Assignment and Coverage

    Running rank checks across 10+ countries introduces a prioritization problem. Not all markets need the same check frequency. A useful breakdown:

    1. Tier 1 markets (US, UK, DE, JP, AU) — check every 4-6 hours, mobile proxies required
    2. Tier 2 markets (SG, FR, BR, CA, KR) — check every 12 hours, residential proxies acceptable
    3. Tier 3 markets (remaining) — daily checks, ISP proxies usually sufficient

    For Tier 1, budget for mobile proxies from carriers that match the market. US AT&T or T-Mobile IPs for the US App Store outperform generic residential on trust scoring. For Tier 2 and below, the cost savings from using residential are meaningful and the block rate difference is tolerable at 12+ hour intervals.

    This tiered approach is similar to what proxy patterns for ad verification uses — high-trust proxies for high-value markets, cost-optimized tiers everywhere else.

    When you scale past 20 countries, proxy health becomes a real operational concern. Stale IPs, misconfigured sticky sessions, and provider outages will silently corrupt your ranking data. The Build a Proxy Health Monitor guide covers how to build real-time status checks that catch these failures before they become data quality problems.

    Common Failure Modes and Fixes

    • Silent 200s with bad data: App stores sometimes return a 200 with a CAPTCHA page or empty results. Always validate that the response contains expected app count or known app IDs.
    • Geo mismatch: Your proxy reports US location, but the App Store serves UK results. Verify geo assignment by hitting an IP-check endpoint before each session batch.
    • Rate limit drift: Block rates increase gradually over days, not immediately. Monitor your 429 rate on a rolling 24-hour window, not just current session.
    • UA inconsistency: Mobile proxies with desktop UAs get higher scrutiny. Match Android/iOS UA to mobile proxy type.

    The proxy selection guide for sneaker bots has a useful breakdown of fingerprint consistency requirements that applies directly here — the same platform-signal matching logic that works for checkout flows works for app store API calls.

    Bottom line

    For app store position tracking in 2026, use mobile proxies for Tier 1 markets, session-level rotation for keyword flows, and a tiered geo strategy to keep costs in check without sacrificing data quality. Validate response content — not just status codes — at every step. DRT covers proxy infrastructure patterns like these in depth; if you’re building a tracking pipeline from scratch, the health monitoring and proxy selection guides are the right starting points before you write a line of scraping code.

    Related guides on dataresearchtools.com

  • Proxy Patterns for Brand Protection Monitoring (2026)

    Brand protection monitoring is one of the few scraping use cases where getting caught isn’t just inconvenient — it’s catastrophically bad for the data. Counterfeit listings disappear, grey-market sellers rotate domains, and unauthorized resellers swap pricing the moment they detect a crawler. Proxy patterns for brand protection monitoring have to be built around stealth, geographic precision, and high rotation frequency, or the data you collect is already stale by the time it lands in your pipeline.

    Why Standard Residential Proxies Fall Short

    Most brand protection teams start with a residential proxy pool and call it done. That works for basic price monitoring, but it breaks down fast when you need to:

    • Detect unauthorized resellers across 15+ marketplaces simultaneously
    • Verify geo-restricted counterfeit listings that only surface in specific countries
    • Monitor social commerce platforms (TikTok Shop, Instagram Shopping) that fingerprint proxy ASNs aggressively
    • Catch trademark violations on ad networks that rotate creatives by IP geolocation

    Residential proxies from large pools (Bright Data, Oxylabs, Smartproxy) share exit IPs across thousands of customers. A single IP used for scraping Amazon one hour and brand-checking Shopify the next carries cross-contamination risk. Platforms that flag scraper IPs share blocklists — your “clean” residential IP may already be poisoned before you use it.

    The better approach is proxy segmentation by platform tier.

    Proxy Type Selection by Platform Tier

    Not every marketplace deserves the same proxy budget. Tier your infrastructure to match detection sophistication:

    Platform Type Recommended Proxy Rotation Frequency Typical Cost
    Amazon, eBay, Walmart Mobile (4G/5G) Per request $8-15/GB
    Shopify storefronts ISP residential Per session (5-10 min) $2-4/GB
    Social commerce (TikTok Shop) Mobile with sticky sessions Per product page $10-20/GB
    Brand registry portals Datacenter (authenticated) Per login session $0.10-0.50/GB
    Telegram/Discord grey markets SOCKS5 mobile Per conversation thread $12-18/GB

    Mobile proxies outperform residential for high-value targets because they present real carrier ASNs (Singtel, Verizon, EE) rather than ISP ranges that platforms have learned to profile. For the same reason they dominate in proxy selection for sneaker bots — the underlying fingerprint logic is identical: platforms want to see a real device on a real carrier network.

    Geographic Targeting and the Country-IP Mismatch Problem

    Counterfeit goods listings are often geo-fenced. A fake luxury handbag listing on a Southeast Asian marketplace may never appear to a US IP. Your monitoring stack has to request pages from within the target country, not from a proxy provider’s nearest PoP.

    The critical mistake is using a provider’s “country targeting” feature without verifying actual exit geography. Many residential pools label IPs by billing country, not by where the device physically connects. Run a validation sweep before any monitoring campaign:

    import httpx
    import asyncio
    
    async def verify_exit_geo(proxy_url: str, expected_country: str) -> dict:
        async with httpx.AsyncClient(proxies={"all://": proxy_url}, timeout=10) as client:
            r = await client.get("https://ipapi.co/json/")
            data = r.json()
            return {
                "proxy": proxy_url,
                "actual_country": data.get("country_code"),
                "asn": data.get("org"),
                "match": data.get("country_code") == expected_country
            }
    
    # Run against your pool before campaign launch
    results = asyncio.run(asyncio.gather(*[
        verify_exit_geo(p, "SG") for p in proxy_pool[:50]
    ]))
    mismatches = [r for r in results if not r["match"]]
    print(f"{len(mismatches)} geo mismatches out of 50 sampled")

    In practice, 10-25% of “country-targeted” residential IPs fail this check with budget providers. For brand monitoring campaigns tied to specific markets (EU luxury goods enforcement, SG parallel imports), this mismatch rate produces false negatives — you conclude a listing doesn’t exist because your IP was routed through a different country.

    Session and Fingerprint Management

    Brand protection crawls have a different session lifecycle than standard price scrapers. You’re not just fetching a product page — you’re often navigating seller profiles, clicking through to contact pages, and capturing screenshots for legal evidence.

    Key session rules:

    1. Bind one IP to one seller investigation workflow from start to finish. Never rotate mid-session on a seller profile page.
    2. Use browser-level fingerprinting (Playwright with real Chrome, not httpx) for any platform that serves React or Next.js storefronts.
    3. Set realistic viewport, locale, and timezone headers that match the exit IP’s country.
    4. Add 2-8 second jitter between page transitions — brand protection crawls are slower than price scrapers because the evidence chain matters.
    5. Archive full HTTP response headers alongside screenshots for legal defensibility.

    This is the same session discipline required in ad verification at scale, where a session that switches IPs mid-audit produces evidence that opposing counsel can challenge in court.

    Marketplace-Specific Patterns

    Amazon Brand Registry Monitoring

    Amazon’s Brand Registry portal itself uses authenticated sessions, so datacenter proxies are fine there. The risk surface is the public marketplace, where you’re scraping ASIN pages to detect unauthorized third-party sellers. Use residential or ISP proxies per ASIN batch, and rotate after every 15-20 requests per IP.

    Watch for Amazon’s “dogs of war” pattern: they serve honeypot ASINs to scrapers with slightly wrong pricing data. If your monitoring pipeline shows wildly inconsistent prices that don’t match manual checks, you’re likely getting served poisoned responses.

    App Store and Social Platform Monitoring

    App store brand monitoring (fake apps impersonating your brand) uses a different proxy pattern to what’s needed for position tracking — you’re not tracking rank, you’re doing bulk search sweeps for trademark variations. Mobile proxies with country rotation work best here because Apple and Google serve different search results by device locale, not just IP geolocation.

    Affiliate and Reseller Channel Audits

    Unauthorized affiliate channels are the hardest to catch because they’re often behind branded subdomains or redirect chains. The scraping pattern has to follow the full redirect chain before rendering. A proxy that blocks CONNECT tunneling will silently drop the affiliate referral parameter, giving you a false “clean” result. This overlaps with the challenge covered in affiliate network validation — the proxy stack has to preserve redirect fidelity end to end.

    Building a Rotation Architecture That Holds Up

    A solid brand protection proxy architecture follows the same layered design as any serious scraping system. The proxy server architecture patterns guide covers the component breakdown in depth, but for brand protection the critical additions are:

    • Evidence archiving layer: every request that captures a counterfeit listing must log the full response, exit IP, timestamp (UTC), and geo verification result. Store this in append-only object storage, not a mutable database.
    • Dedup by seller fingerprint, not URL: the same counterfeit seller will rotate product URLs. Your dedup key should be seller ID + marketplace, not listing URL.
    • Separate pools for evidence capture vs. discovery: use cheap residential for broad discovery sweeps, reserve mobile IPs for the evidence capture requests you’ll present to brand registry or legal counsel.

    Failing to separate these pools is expensive. Mobile proxy bandwidth at $12-18/GB burns fast when you’re doing discovery sweeps across thousands of search queries. Keep mobile strictly for the 5-10% of findings that need defensible screenshots.

    Bottom Line

    For brand protection monitoring in 2026, use mobile proxies for evidence capture on tier-1 marketplaces, ISP residential for session-heavy storefronts, and datacenter only for authenticated brand registry portals. Always geo-verify your exit IPs before campaign launch — mislabeled country pools are the single biggest source of false negatives. DRT covers proxy infrastructure patterns for these exact production use cases, and the tradeoffs here hold across every marketplace vertical where legal defensibility of the captured data actually matters.

    Related guides on dataresearchtools.com

  • Proxy Patterns for Continuous SEO Rank Tracking 2026: Cost vs Coverage

    Continuous SEO rank tracking is deceptively expensive at scale. Pull 500 keywords across 10 locales daily and you are firing 5,000 requests every 24 hours — enough to trigger Google’s bot detection within minutes unless your proxy layer is designed for it. The proxy patterns for SEO rank tracking in 2026 are not the same ones you would use for e-commerce or social scraping, and the cost-vs-coverage tradeoff is sharper than most teams realize when they first spec out a tracker.

    Why SEO Rank Tracking Has Unique Proxy Requirements

    Google SERPs are the most aggressively defended scrape target on the web. Cloudflare, reCAPTCHA v3, and Google’s own fingerprinting stack all run in parallel. The failure mode is not a 403 — it is a degraded SERP that looks real but returns a CAPTCHA page or a country-mismatch result, silently poisoning your rank data.

    The requirements that follow from this:

    • Residential or mobile IPs only. Datacenter ranges are blocked or heavily throttled on Google Search within hours of high-volume use.
    • Geo-matched IPs. A Singapore IP returning results for a UK keyword query will pull a geo-biased SERP. You need IPs in the same city or region as your target locale.
    • Low request rate per IP. Google’s session model tolerates roughly 3-5 SERP requests per IP per hour before score degradation. Burst above that and you burn the IP.
    • Consistent User-Agent + cookie jar pairing. Rotating UA without rotating cookies (or vice versa) creates a fingerprint mismatch that triggers detection faster than either alone.

    Proxy Type Comparison: Residential vs Mobile vs ISP

    Not all residential proxies behave the same way for rank tracking. Here is how the main categories compare in 2026 practice:

    Type Pass Rate (Google) Cost per GB Best Use Case
    Residential rotating ~85-92% $3-8 Broad keyword sets, multi-locale
    Mobile (4G/5G) ~96-99% $12-25 High-value keywords, local packs
    ISP (static residential) ~88-94% $2-5 Consistent session tracking
    Datacenter ~30-55% $0.20-0.80 Not recommended for Google SERPs

    Mobile proxies have the highest pass rates because the IP ASN maps to a carrier, not a hosting provider, but the cost is 3-5x residential. The practical split most teams land on is mobile for the top 10-20% of keywords by revenue importance, and residential rotating for the long tail. If you are also running ad verification workflows, the same mobile pool can pull double duty — this overlap is discussed in Proxy Patterns for Ad Verification at Scale (2026).

    Request Scheduling: The Architecture That Determines Cost

    The biggest cost lever is not which proxy provider you pick — it is how you schedule requests. Naive rank trackers fire all keywords in parallel bursts at the same time each day. This maximizes IP burn rate and forces you to buy more bandwidth to compensate.

    A better pattern:

    1. Spread requests across a 6-hour window. Pick a window that matches off-peak search activity in your target locale (typically 2am-8am local time). Fewer concurrent queries from the same IP pool means lower per-IP load.
    2. Group keywords by locale first, then by query intent. Brand keywords, local pack queries, and informational queries hit different SERP layouts. Grouping them lets you reuse the same proxy session for similar fingerprint patterns.
    3. Implement exponential backoff on 429s, not just retries. A flat retry loop burns IPs. Back off 30s, 2min, 8min before rotating to a fresh IP.
    4. Cache static SERP elements. Knowledge panels, featured snippets, and “People also ask” boxes change slowly. Pull them once daily at full fidelity, not on every keyword cycle.

    A minimal Python scheduler config that applies jitter to avoid predictable timing:

    import random, time
    
    def throttled_request(session, url, base_delay=12):
        jitter = random.uniform(0.5, 1.8)
        time.sleep(base_delay * jitter)
        return session.get(url, timeout=15)

    The base_delay of 12 seconds keeps you under 5 requests per IP per hour at a single-thread level. Run 4 threads per proxy session and you hit roughly 20 requests per hour per IP — still within safe range for most residential providers.

    Locale Coverage Without Breaking the Budget

    Multi-locale tracking is where budgets blow up. The temptation is to buy geo-targeted residential pools in every country you track. In practice, most teams only need city-level accuracy for local pack keywords — country-level IPs are sufficient for standard organic rankings.

    A tiered coverage model keeps costs manageable:

    • Tier 1 (city-level mobile): Primary revenue markets, local pack tracking, Google Maps rank checks
    • Tier 2 (country-level residential): Secondary markets, informational keyword monitoring
    • Tier 3 (shared rotating residential): Long-tail, low-priority, or experimental keyword sets

    For affiliate sites doing competitive rank monitoring across many verticals, this same tiering logic applies to proxy selection decisions more broadly, as covered in Proxy Patterns for Affiliate Network Validation in 2026.

    One underused tactic: for locales where you have low keyword volume (under 50 keywords), use a proxy provider’s on-demand geo-targeting rather than a dedicated pool. Providers like Oxylabs, Bright Data, and Smartproxy all support country+city targeting on their rotating residential endpoints with no minimum commitment.

    Handling Detection and Result Validation

    A proxy that returns a 200 is not the same as a proxy that returned a valid SERP. Google serves different page structures to suspected bots, and if your parser is not validating SERP structure before storing rank data, you are silently ingesting garbage.

    Validation checks to run before writing rank data:

    • Confirm the #search div or equivalent organic results container is present
    • Check that the number of organic results is within expected range (7-10 for standard queries)
    • Verify the result URLs are real domains, not redirect traps
    • Flag any response where the page title contains “unusual traffic” or CAPTCHA patterns

    The same challenge of detecting degraded or fraudulent responses shows up in survey and earn-app proxy setups, where providers serve fake completion pages to suspected automation — Proxy Selection for Survey Sites and Earn Apps (2026) covers that validation pattern in detail.

    For video and YouTube SERP tracking, the fingerprinting stack is slightly more lenient than Google Search but locale-matching matters even more because YouTube’s ranking algorithm is heavily localized. If you are tracking video properties alongside web rankings, YouTube SEO and Video Rank Tracking with Proxies (2026) lays out the specific IP requirements for YouTube SERP pulls.

    The sneaker-drop proxy community solved rotating IP exhaustion under high detection pressure years before the SEO tracking world caught up — Proxy Selection for Limited Drop Sneaker Releases (2026) has relevant patterns for IP recycling and session warm-up that translate directly to rank tracker architecture.

    Bottom Line

    For most teams running 500-2,000 keywords daily, the right setup is residential rotating for the long tail plus a small mobile pool for local and high-value terms, with request jitter and SERP validation baked in from day one. Skipping validation is the most common reason rank data becomes unreliable under scale. DRT covers proxy infrastructure and scraping patterns across SEO, ad tech, and data collection — if this architecture is relevant to your stack, the other proxy use-case guides in this series are worth a read.

    Related guides on dataresearchtools.com

  • How to Scrape Taleo Career Sites at Scale (2026)

    Oracle Taleo powers job listings for thousands of enterprise employers — Fortune 500s, healthcare systems, government contractors — and scraping it at scale is genuinely harder than scraping most ATS platforms. The challenge is not just pagination; Taleo’s hosted endpoints vary by tenant subdomain, its JavaScript-heavy requisition pages resist simple HTTP fetches, and its rate limiting is aggressive enough to block naive scrapers within minutes.

    How Taleo’s Architecture Works (and Why It Matters)

    Taleo deployments fall into two patterns. The older “hosted” model puts job listings at a subdomain like company.taleo.net/careersection/, while newer Oracle Recruiting Cloud (ORC) tenants serve listings under fa-xxxx.oraclecloud.com. Both use server-side rendered pages for the job list but load full requisition details via internal API calls.

    The key discovery: every Taleo instance exposes a semi-public REST endpoint at /careersection/rest/jobboard/searchjobs (older hosted) or a GraphQL-style endpoint in ORC. Hitting this directly returns JSON, bypassing HTML parsing entirely and cutting scrape complexity by half.

    import httpx
    
    TENANT = "companyname"
    BASE = f"https://{TENANT}.taleo.net/careersection/rest/jobboard/searchjobs"
    
    params = {
        "multiln": "false",
        "lang": "en",
        "start": 0,
        "limit": 25,
        "portal": "1",
    }
    
    headers = {
        "Accept": "application/json",
        "Referer": f"https://{TENANT}.taleo.net/careersection/joblist.ftl",
    }
    
    resp = httpx.get(BASE, params=params, headers=headers, timeout=15)
    data = resp.json()
    jobs = data.get("requisitionList", [])

    Increment start by 25 per page until requisitionList is empty. For ORC tenants, the endpoint changes to a v2/jobs path — inspect XHR calls in DevTools to find it.

    Tenant Discovery at Scale

    Scraping one company is trivial. Scraping thousands requires a tenant enumeration strategy. There is no official registry, so you build it from:

    1. LinkedIn job postings that include taleo.net in the apply URL
    2. Google dork: site:taleo.net "careersection" "apply now"
    3. Common Crawl extracts filtered by taleo.net hostnames
    4. Job board APIs (Indeed, ZipRecruiter) that leak the ATS apply URL

    Once you have a list of subdomains, check liveness with a HEAD request to /careersection/joblist.ftl. Expect 10–30% to return 404 (abandoned tenants) or redirect to the parent company’s careers page after an acquisition.

    If you are scraping Ashby or iCIMS tenants alongside Taleo for a talent pipeline, the same discovery pattern applies — see How to Scrape Ashby Career Sites for Talent Pipelines (2026) for a comparable approach, and How to Scrape iCIMS Career Sites (2026) for iCIMS-specific quirks.

    Rate Limiting and Anti-Bot Behavior

    Taleo hosted instances run Oracle’s WAF in front of a JBoss application server. The rate limits are tenant-configurable but typical defaults are:

    Behavior Threshold Response
    Rapid sequential requests >10 req/s per IP 429 or silent 503
    Missing Referer/Accept headers Any rate 403
    Session cookie absence First request Redirect to login
    ORC tenants (FA-series) >5 req/s per IP Akamai bot challenge

    The session cookie issue is the most common failure mode. Taleo hosted requires a valid JSESSIONID plus a TaleoSID cookie acquired from the initial page load. The REST endpoint will return a 302 to the login page if these are absent.

    Fix this by doing a single GET to /careersection/joblist.ftl before hitting the REST endpoint, capturing cookies from the response, and forwarding them on all subsequent requests. With httpx, use a Client with cookie jar enabled:

    with httpx.Client(follow_redirects=True) as client:
        client.get(f"https://{TENANT}.taleo.net/careersection/joblist.ftl")
        # cookies now populated
        resp = client.get(BASE, params=params, headers=headers)

    For ORC tenants on Akamai, residential proxies are unavoidable. Datacenter IPs get challenged immediately. The proxy rotation pattern is the same one covered in How Proxies Help Scrape Reviews at Scale: Yelp, Google, Trustpilot (2026) — one IP per session, rotate on 429, minimum 2-second delay between requisition fetches.

    Parsing Requisition Detail Pages

    The job list API returns metadata (title, location, req ID, posting date) but not the full description. To get the JD body, you need to hit the requisition detail page:

    /careersection/10000/jobdetail.ftl?job={reqId}&lang=en

    This is an HTML page. The description sits inside a

    container. Parse with BeautifulSoup:

    from bs4 import BeautifulSoup
    
    detail_resp = client.get(
        f"https://{TENANT}.taleo.net/careersection/10000/jobdetail.ftl",
        params={"job": req_id, "lang": "en"},
    )
    soup = BeautifulSoup(detail_resp.text, "lxml")
    desc_div = soup.find("div", id="requisitionDescriptionInterface")
    description = desc_div.get_text(separator="\n").strip() if desc_div else ""

    Note: the 10000 in the URL is the career section ID, not a real number. Different tenants use different IDs (10000, 10200, 5001, etc.). Check the job list page source for the correct value before scraping.

    Key fields to extract from detail pages:

    • Job title, requisition ID, posting date
    • Location (often structured as city, state, country separately)
    • Employment type (full-time / contract / internship)
    • Department and business unit
    • Full JD text (HTML preserved for downstream parsing)

    Infrastructure for Multi-Tenant Runs

    Running this against hundreds of tenants in parallel requires a queue, not a loop. A simple architecture:

    • Queue: Redis or SQS with tenant subdomains as items
    • Workers: 4–8 async Python workers per machine, each managing its own httpx Client with cookie jar
    • Proxy pool: Rotate IPs at the worker level, not per-request. Sticky sessions per tenant reduces cookie re-acquisition overhead.
    • Storage: Write raw JSON and HTML to S3 or local disk first, parse separately. Parsing bugs should not require re-fetching.
    • Dedup: Hash on (tenant, reqId) to skip already-seen requisitions on incremental runs.

    For comparison, the same async worker pattern applies well when scraping product data at scale — the worker isolation model described here is similar to what you would use for How to Scrape Amazon Best Sellers Across 18 Marketplaces (2026). For brand and company intelligence use cases that combine job data with public registry data, see How to Scrape Amazon Brand Registry Public Pages (2026) for a comparable enrichment workflow.

    For incremental runs, check postingDate against your last-seen timestamp per tenant rather than re-fetching the full listing. Most enterprise tenants post under 50 new roles per week, so a daily incremental pull with a 7-day lookback window covers 99% of new postings.

    Bottom Line

    Taleo is scrapeable at scale once you handle the session cookie requirement and split your scrape into a fast list API call plus a slower detail HTML fetch. Target the /rest/jobboard/searchjobs endpoint first; fall back to HTML parsing only if the tenant blocks it. Use residential proxies for ORC (FA-series) tenants and rate-limit to one requisition fetch every 2–3 seconds per IP. DRT covers patterns like this across the ATS and e-commerce scraping landscape for engineers who need production-grade pipelines, not toy examples.

    Related guides on dataresearchtools.com

  • How to Scrape iCIMS Career Sites (2026)

    iCIMS powers career portals for thousands of mid-to-enterprise employers, and scraping it at scale is harder than it looks. The platform serves job listings through JavaScript-rendered pages, enforces bot detection via Cloudflare and custom fingerprinting, and rotates URL structures across tenant subdomains. if you’re building a talent pipeline, competitive intelligence feed, or labor market dataset, here’s what actually works in 2026.

    How iCIMS Structures Its Job Data

    iCIMS career sites follow a predictable tenant subdomain pattern: https://{company}.icims.com/jobs/search. each company gets its own subdomain, but the underlying HTML skeleton is consistent across tenants. job detail pages live at /jobs/{job_id}/job and contain the full description, location, department, and requisition metadata in both rendered HTML and a partially-hydrated JSON blob embedded in a