# TruePeopleSearch.com Scraping: Extract Data Without Blocks > Source: https://scrape.do/blog/true-people-search-scraping/ Published: 2025-05-27 · Updated: 2026-02-24 · Authors: Onur Mese · Categories: Scraping Use Cases > ⚠ No real data about a real person has been used in this article. Target URLs have been modified by hand to not reveal any personal information of a real person. TruePeopleSearch.com is one of the most popular free [people search](https://scrape.do/blog/people-scraping/) tools out there. It'll show names, addresses, phone numbers, and public records in seconds without even signing up. **But try scraping it, and things fall apart quickly.** The site doesn’t just make [web scraping](https://scrape.do/blog/web-scraping/) difficult; it actively blocks non-browser traffic, throws up Cloudflare challenges, and refuses to load unless you're coming from inside the US. It looks simple on the surface, but it’s well-protected against automated access. That said, there’s a way through it. In this guide, we’ll use Python and Scrape.do to extract data from TruePeopleSearch in a clean, structured way. [Access fully functioning code here. ⚙](https://github.com/scrape-do/scrapedo-scrapers/tree/main/truepeoplesearch-scraper) ## Why Is Scraping TruePeopleSearch.com Difficult? TruePeopleSearch is built to look lightweight and simple, but under the hood it’s just as aggressive as any high-security site at stopping scrapers. There are two main reasons it’s hard to work with: ### Georestricted to the US The entire site is geofenced. If you try to access it from a non-US IP, you won’t even see a loading screen. It just cuts you off. **Rude!** ![truepeoplesearch blocked](/uploads/blog/truepeoplesearch-blocked_huf1e892fe9a125d3e637f4de421330c92_35592_1200x0_resize_q80_h2_box_3.webp) ### Protected by Cloudflare TruePeopleSearch uses Cloudflare to protect its pages. That means your script has to pass JavaScript challenges, spoof fingerprint headers, and sometimes even handle CAPTCHA forms. If you're just using a library like `requests` or `httpx`, your scraper is going to stall out before it ever sees the page content. ![truepeoplesearch scraping CAPTCHA](/uploads/blog/truepeoplesearch-captcha_hu7d65205253cf2ec99f6120c6ee36c5c4_14087_1200x0_resize_q80_h2_box_3.webp) You’re fighting an active system that’s constantly analyzing your request and deciding whether it looks human or not. **And most of the time, it'll say no.** Push too hard and you'll get rate limited on top of it. Cloudflare tracks request frequency per session and escalates to harder challenges when it detects automated patterns. ### How Scrape.do Bypasses These Blocks *Scrape.do solves both of TruePeopleSearch’s core defenses in one step.* By setting `geoCode=us` and `super=true`, you force your request through a US-based residential IP. Not a datacenter, not a shared proxy; **an actual high-trust IP that looks like a real user in the US.** That alone is enough to get past both the georestriction and Cloudflare’s default bot detection. You don’t need to rotate proxies, tweak headers, or simulate browser behavior. **Just pass two parameters and one API call, get real HTML back, and move on.** Since TruePeopleSearch doesn't offer a public API, this proxy-based approach is the only practical way to pull its data programmatically. ## Creating a Basic TruePeopleSearch Scraper We’ll start with a TruePeopleSearch result page (not a homepage or search form) and walk through getting access, extracting data, and printing it in a clean, readable format. No real person’s data is being used here, **the data included in the target page below is made-up and modified:** ![truepeoplesearch scraper](/uploads/blog/truepeoplesearch-scraper_hu3e1915b776c7c3d8939327becefa3eef_40699_1200x0_resize_q80_h2_box_3.webp) And the target URL we use is a placeholder and should be swapped with any profile URL you get from a manual search. ### Prerequisites We’ll be [web scraping in Python](https://scrape.do/blog/python-web-scraping/) using `requests` for making the call and `BeautifulSoup` for parsing the returned HTML. If you don’t already have them: ```bash pip install requests beautifulsoup4 ``` You’ll also need a Scrape.do account and API key. You can [sign up here for free](https://dashboard.scrape.do/sign-up) (no credit card required) and get 1000 credits/month. ### Sending a Request and Verifying Access Now let’s test the request. We’ll send it through Scrape.do using two key parameters: * `geoCode=us` for US-only access, * `super=true` to switch to residential IPs that bypass detection. Here’s the starting script: ```python import requests import urllib.parse from bs4 import BeautifulSoup # Your Scrape.do API token token = "" # Target URL target_url = "https://www.truepeoplesearch.com/find/person/jane-doe" encoded_url = urllib.parse.quote_plus(target_url) # Scrape.do API endpoint - enabling "super=true" and "geoCode=us" for US-based residential proxies api_url = f"https://api.scrape.do/?token={token}&url={encoded_url}&super=true&geoCode=us" # Send the request and parse HTML response = requests.get(api_url) soup = BeautifulSoup(response.text, "html.parser") print(response) ``` If everything is working correctly, you should see: ```python ``` Which means the page loaded successfully and you can start extracting data. ### Extracting Name and Age Once the page loads, the name and age are usually stored inside a block with `id="personDetails"`. Instead of scraping visible text, we can pull them directly from the HTML attributes `data-fn`, `data-ln`, and `data-age`. This avoids any formatting issues or nested tags. You're pulling values straight from the DOM, exactly how the site loads them. Here’s how to do it: ```python # Extract name and age person = soup.find("div", id="personDetails") name = f"{person['data-fn']} {person['data-ln']}" age = person["data-age"] print("Name:", name) print("Age:", age) ``` You should get something like: ```python Name: Jane Doe Age: 23 ``` This method is reliable because it’s tied to how the site structures its data, not how it looks visually. Next we'll find out where Jane lives: ### Extracting Address, City, and State TruePeopleSearch displays addresses in a clean, structured block inside an anchor tag marked with `data-link-to-more="address"`. Inside that block, you'll find all the pieces you need: street, city, and state; **each stored in its own** `` **tag with a semantic** `itemprop`. We’ll target those specific spans directly, so we don’t have to rely on brittle class names or text matching. Here’s the code: ```python # Extract address, city, state addr = soup.find("a", {"data-link-to-more": "address"}) address = addr.find("span", itemprop="streetAddress").text.strip() city = addr.find("span", itemprop="addressLocality").text.strip() state = addr.find("span", itemprop="addressRegion").text.strip() print("Address:", address) print("City:", city) print("State:", state) ``` If everything went right, you should print something similar to: ```python Address: 2912 Northern Ave WE City: Washington State: DC ``` ### Extracting Phone Number Phone numbers on TruePeopleSearch are listed in a similar structure to the address. They’re nested inside an anchor with `data-link-to-more="phone"` and use a `` tag with `itemprop="telephone"`. **We’ll grab that value directly:** ```python # Extract phone number phone = soup.find("a", {"data-link-to-more": "phone"}).find("span", itemprop="telephone").text.strip() print("Phone Number:", phone) ``` And that gives you something like: ```python Phone Number: (202) 555-5555 ``` Now let’s pull it all together. ### Final Code and Output Below is the complete script that handles the request, parses the full HTML, and extracts structured data: ```python import requests import urllib.parse from bs4 import BeautifulSoup # Your Scrape.do API token token = "" # Target URL target_url = "https://www.truepeoplesearch.com/find/person/jane-doe" encoded_url = urllib.parse.quote_plus(target_url) # Scrape.do API endpoint - enabling "super=true" and "geoCode=us" for US-based residential proxies api_url = f"https://api.scrape.do/?token={token}&url={encoded_url}&super=true&geoCode=us" # Send the request and parse HTML response = requests.get(api_url) soup = BeautifulSoup(response.text, "html.parser") # Extract name and age person = soup.find("div", id="personDetails") name = f"{person['data-fn']} {person['data-ln']}" age = person["data-age"] # Extract address, city, state addr = soup.find("a", {"data-link-to-more": "address"}) address = addr.find("span", itemprop="streetAddress").text.strip() city = addr.find("span", itemprop="addressLocality").text.strip() state = addr.find("span", itemprop="addressRegion").text.strip() # Extract phone number phone = soup.find("a", {"data-link-to-more": "phone"}).find("span", itemprop="telephone").text.strip() # Print output print("Name:", name) print("Age:", age) print("Address:", address) print("City:", city) print("State:", state) print("Phone Number:", phone) ``` And here’s what you should see in your terminal if you inputted a real URL from TruePeopleSearch: ```python Name: Jane Doe Age: 23 Address: 2912 Northern Ave WE City: Washington State: DC Phone Number: (202) 555-5555 ``` And that’s it — you’re now scraping TruePeopleSearch cleanly. ## Extract Emails, Relatives, and More The basic scraper above covers name, age, address, and phone, but TruePeopleSearch profiles hold significantly more data than that. Every profile page embeds a [JSON-LD](https://json-ld.org/) structured data block inside a `