Fetch real-time data from 100+ websites,No development or maintenance required.
Over 100 million real residential IPs from genuine users across 190+ countries.
SCRAPING SOLUTIONS
Get accurate and in real-time results sourced from Google, Bing, and more.
With 120+ prebuilt and custom scrapers ready for any use case.
No blocks, no CAPTCHAs—unlock websites seamlessly at scale.
Execute scripts in stealth browsers with full rendering and automation
PROXY INFRASTRUCTURE
Over 100 million real residential IPs from genuine users across 190+ countries.
Reliable mobile data extraction, powered by real 4G/5G mobile IPs.
For time-sensitive tasks, utilize residential IPs with unlimited bandwidth.
Fast and cost-efficient IPs optimized for large-scale scraping.
SCRAPING SOLUTIONS
PROXY INFRASTRUCTURE
DATA FEEDS
Full details on all features, parameters, and integrations, with code samples in every major language.
LEARNING HUB
ALL LOCATIONS Proxy Locations
TOOLS
RESELLER
Get up to 50%
Contact sales:partner@thordata.com
Products $/GB
Fetch real-time data from 100+ websites,No development or maintenance required.
Get real-time results from search engines. Only pay for successful responses.
Execute scripts in stealth browsers with full rendering and automation.
Bid farewell to CAPTCHAs and anti-scraping, scrape public sites effortlessly.
Dataset Marketplace Pre-collected data from 100+ domains.
Over 100 million real residential IPs from genuine users across 190+ countries.
Reliable mobile data extraction, powered by real 4G/5G mobile IPs.
For time-sensitive tasks, utilize residential IPs with unlimited bandwidth.
Fast and cost-efficient IPs optimized for large-scale scraping.
Data for AI $/GB
Pricing $0/GB
Docs $/GB
Full details on all features, parameters, and integrations, with code samples in every major language.
Resource $/GB
EN $/GB
产品 $/GB
AI数据 $/GB
定价 $0/GB
产品文档 $/GB
资源 $/GB
简体中文 $/GB
First things first, we’ll prepare our development environment, and Python will be our best friend here, because it comes with libraries that will make getting all the content we want a breeze. While there are several popular libraries we can utilize, such as Scrapy, we’ll focus on Beautiful Soup, which makes the extracted data nicely structured and readable. We’ll want to put our proxies to use as well, particularly rotating IPs, like Throdata’s residential proxies, in order to avoid rate limits and geo-restrictions that will seek to prevent us from collecting data at scale.
Python is simple, flexible, and versatile, which has made it the most popular programming language for web scraping. For our purposes, we’ll install Python 3.9 or later, then set up a virtual environment to separate different projects’ dependencies. We can create as many of these environments as we need. We’ll just run the venv module from Python’s library in a directory we want it to reside in, using the directory path: python -m venv decodo-env. This new decodo-env directory will contain the necessary Python files for our virtual environment. Then, we activate it in the terminal:
Next up, we’ll run pip install requests beautifulsoup4 lxml playwright python-dotenv. Let’s briefly overview why these tools are needed:
Playwright needs browser binaries to be downloaded separately, so we’ll use playwright install.
A proxy is the key that will open the doors to data that would otherwise be blocked. It hides our IP so that websites only see the proxy’s IP, which lets us access all the data we seek. This process appears organic and human, a key factor further strengthened by rotating proxies, which don’t allow a high volume of requests to come from the same source, instead sending multiple requests from different IPs.
A scraper rotates through numerous IPs, distributing the traffic load across them, increasing the data collection rate without triggering the rate limits. We can extract a ton of data as we bypass firewalls and geo-restrictions.
Throdata’s residential proxies boast the best response time in the market, along with 115M+ IPs in 195+ locations, allowing you to collect real-time data from any website.
Here are simple steps to set up Decodo residential proxies with rotating IPs:
Watch our tutorial to learn how to set up residential proxies.

To manage authentication for applications that use proxies, we commonly set proxy credentials in environment variables in order to prevent hardcoding sensitive information directly into our code or configuration files.
Now, you may wonder about the difference between residential and datacenter proxies. Both hide your IP and enable access to restricted websites and geo-blocked content.
Datacenter proxies are a great and cost-effective tool for large-scale extractions from less restrictive websites, while residential proxies use regular users’ devices across the globe, imitating a genuine user, thus being the best tool for scraping more restrictive sites.
| Residential proxies | Datacenter proxies | |
| Use | High-security websites with strong anti-bot systems | Simple targets with weak or no anti-bot measures |
| Trust score | High (real ISP IPs) | Low (easily identified) |
| Speed | Slower (home bandwidth) | Fast (server-grade) |
| Cost | Higher | Lower |
| Block risk | Low | High |
| Anonymity | High | Basic |
Here’s an example of clean, modular file organization, with separate concerns, for a Python project:

In this section, we’ll cover a couple of ways to extract clean text from HTML pages. For starters, text scraping will be very different depending on the content type, whether it’s static or dynamic.
Static content includes all elements on a page embedded directly into the HTML document, so everything will be available in the first HTML response. This will include text, images, UI elements, and other content that changes only when the server-side source code gets updated. This is how to scrape static content:
A popular scraping stack for retrieving static content includes Requests and Beautiful Soup, while proxies are the best tool to avoid blocks.
On the other hand, dynamic content isn’t included in the original HTML document that the server returns, as it’s added to the page only after JavaScript execution. And because browsers run JavaScript, we must use browser automation tools like Playwright or Selenium to scrape dynamic content.
Now it’s time to take a closer look at the above-mentioned Beautiful Soup. This is a hugely popular Python library that forms parse trees to extract text from HTML. We’ll follow these steps to extract our text:
The get_text() method allows us to eliminate whitespace and maintain document structure. We also want to remove unwanted elements (<script>, <style>, <nav>, <header>, <footer>, <aside>). A simple option is to use find_all() with a list of tags, then add decompose() to all elements. This will remove the tag and its content from the parsed tree.
Instead of parsing the entire content, we can use targeted extraction to identify and extract specific data with CSS or XPath. CSS selectors focus on classes, tag types, IDs, and attributes, while XPath navigates the Document Object Model (DOM) in all directions to select elements. XPath is a perfect choice in complex and flexible cases when CSS is simply not enough.
Importantly, the DOM structure can be analyzed to find content-rich elements, allowing the core content to be separated from noise (ads, footers, navigational bars, etc.). The text density analysis, for example, calculates the ratio of text to HTML tags within DOM nodes to identify areas with high text density, i.e. core content, whereas the low-density areas contain noise.
When we handle JavaScript (JS)-rendered content, we want to make sure that browsers, search engines, and web scraping tools all properly process the dynamically generated content. Now, static extraction can fail, and we know it did when we see blank pages and empty data fields. A common culprit is dynamic content that static techniques can’t access.
To counteract this, we can use Playwright to render JavaScript before extraction. We’ll open the URL, wait for the page to render fully, and extract data with Playwright:
1. Install Playwright via npm:
2. Start a browser, chromium.launch()
3. Load the page, page.goto()
4. Wait for the dynamic content to render, page.waitForSelector()
5. Retrieve the rendered HTML, page.content()
6. browser.close()
If a site is built as a React SPA, the real content is rendered by JavaScript in the browser. The solution is to employ a browser automation tool to render the page and then extract the text. This example uses Playwright and Beautiful Soup:
1. Install dependencies

2. Copy this code, save as .py file, and run it in your terminal

Note: hn.algolia.com is the official, real-time search engine for Hacker News, a Rails 5 application with a React frontend.
However, as an alternative for handling JavaScript rendering automatically, we highly recommend the Throdata Web Scraping API. There are five subscription types to choose from, including free and custom options, where each plan comes with proxies, 125M+ IPs globally, 200 requests per second, 99.99% success rate, 100+ prebuilt templates, and results in HTML, JSON, CSV, XHR or PNG.
This is the third essential step in the process, which follows crawling and scraping. Having the text cleaned is necessary for Large Language Model (LLM) training because noise leads to a massive drop in model performance. Here’s what we’ll do:
We’ve reached the final step and now need to save our extracted text. We’ll choose between three formats, JSON, CSV, and specialized databases, depending on what our project requires to be the most efficient.
Plain text output (extracting the readable text content only) allows us to store or process high-volume, raw text data, when the textual content takes priority over style, producing lightweight and highly portable datasets. It’s typically used for large-scale language model training (LLM corpora) and simple, long-term archival purposes.
That said, the industry standard is saving scraped text to .txt files with UTF-8 encoding, because this allows maximum compatibility across platforms, operating systems, and international character sets. Importantly, UTF-8 is not prone to garbled text (aka “mojibake”) thanks to its vast character support.
Structured JSON output in text scraping extracts data from unstructured text (e.g. raw HTML or document content) into a predefined JSON structure. This is crucial to enable cleaner data analysis and LLM training. We can also include metadata to provide more context and integrity, and keep the format consistent. For example, we can add the source URL, title, scrape timestamp, and word count. Let’s take a look at an example:

For large databases, JSONL (JSON Lines) is a good choice. Each line becomes an independent and valid JSON object.
CSV files are the standard format for storing scraped text and getting it nicely organized into rows and columns, enabling easy analysis in Excel or Google Sheets. Python’s pandas library converts data into a DataFrame, and we can export it to CSV (df.to_csv()). Also, Excel Power Query or Google Sheets’ IMPORTXML function allows us to export text with metadata. We use XPath or CSS selectors to structure HTML into columns, which we can then export as CSV/XLSX.
Without a doubt, we’ll need to handle a text with newlines and special characters in CSV files, and we’ll have to do it properly. To accomplish this, we will use standardized UTF-8 encoding for all our CSV files, proper quoting, and built-in libraries such as Python’s csv module.
Database solutions like PostgreSQL or MongoDB are ideal for large-scale text scraping. When it comes to production text scraping specifically, we can use MongoDB for unstructured scraped data, or data that changes often. However, PostgreSQL is a better solution for data that needs strong data integrity. Also, we can use SQLite for local projects and store all data in a single, portable file.
To round up the guide, we’ll take a look at common challenges specific to large-scale text extraction, including blocks and rate limits, as well as inconsistent page structures.
The first thing we’ll learn is to recognize block patterns by monitoring for 403 Forbidden responses, CAPTCHA challenges, and hidden honeypot traps. We’ll want to avoid these setups that are regularly used as anti-bot mechanisms by analyzing HTTP response codes, rendering JavaScript to detect dynamic challenges, and inspecting the DOM for invisible elements.
We can implement request throttling and backoff strategies via specialized techniques like setting rate limits (a token bucket or fixed window) and using parallel processing to handle HTTP 429/503 errors. An effective course of action when faced with rate limits is not to retry immediately. Instead, leverage exponential backoff with jitter to prevent sending requests at fixed intervals. This method will increase wait times exponentially and add random jitter.
All this said, the best strategy is to use rotating residential proxies. Because they rotate through hundreds of ISP-assigned IPs across the world, they appear like legitimate users, allowing proxies to maintain access, avoid blocks, and continue extractions. Avoid datacenter IPs, because they are often flagged instantly, and avoid free proxies as they tend to be unreliable, slow, and unsafe.
This is one of the most common challenges. We extracted data from different sources (e.g., websites, emails, articles, reports), but they’re now coming in all sorts of layouts and merged cells, and nothing is consistent. This can cost us our data. The DOM isn’t consistent, as names change, ads appear, and other elements appear, disappear, or shift. To solve this issue, we can build multiple candidate selectors, heuristics to isolate core information (by leveraging text density and structural features), and fallback layers with multiple selector fallbacks.
We’ll define a list of selectors ordered from most specific to least specific, so that if one fails, the scraper will try the next. The automated fallback strategies are essential to prevent data loss when primary selectors fail during large-scale text extraction. XPath with text-based matching is a strong option as well and can be used to locate elements based on text content rather than fixed DOM structures.
Other issues we can easily run into include encodings (UTF-8, ISO-8859-1, Windows-1252) and mojibake. We can’t detect all encodings, but heuristics are a good option for the most common ones. The best course of action is to prioritize UTF-8 and convert the data into it as soon as this is technically possible. This is also a key strategy to avoid mojibake.
Finally, we’ll validate output quality before downstream processing to reduce error propagation and prevent storing junk data by using a combination of confidence scoring, automated rules, and semantic checks to catch errors and formatting issues.
Once this is done, we’ll continue with monitoring and maintenance by establishing automated pipeline oversight and data quality control and implementing alerts for scraper failures to catch both total system outages and silent failures. We can also utilize version-controlling selectors to track site changes and deploy updates, and schedule periodic re-scrapes for fresh content.
It’s strongly recommended to maintain a diverse pool of proxies and rotate IPs to prevent blocking, as well as to set alerts for when the proxy success rate drops. Speaking of which, Throdata Site Unblocker is a concrete solution for accessing a range of targets while avoiding CAPTCHAs or IP bans. This is a proxy-like solution with a 100% success rate, which allows users to extract data from the most challenging targets without building a web scraper or using a headless browser.
Scraping all text from a website isn’t just a technical task but also a process that builds a resilient system that can adapt to complex, often changing, and even hostile environments. However, combining the right tools with smart strategies will get you maximum value.
When done correctly, text scraping transforms from simple data collection into a basis for intelligent systems, automation, and much more. And when proxies are added into the mix, our web scraping projects become unstoppable.
Looking for
Top-Tier Residential Proxies?
您在寻找顶级高质量的住宅代理吗?
Scraping Multimedia Data for AI Training: Images, Video, Audio
TL;DR Understanding multimedia data types and how they& […]
Unknown
2026-07-15
Buy Box 一夜易主,利润和流量同时流失:购物车归属监控客户的实时预警方案
对依赖 Amazon 等平台销售的品牌和授权经销商来说,Bu ...
Xyla Huxley
2026-07-15
未授权卖家不是价格问题,而是渠道失控信号:品牌如何监控异常店铺与跨区流通
品牌方常常在销量下降或价格混乱后,才发现渠道已经出现异常。某 ...
Xyla Huxley
2026-07-15
本地商家数据不是地图截图:Google Maps、Yelp、Tripadvisor 场景下的评分、营业时间与门店状态监控
本地商家数据对很多行业都很关键:连锁餐饮要看门店评分,酒店集 ...
Xyla Huxley
2026-07-15
名录数据过期,销售团队就会追错客户:B2B 目录采集客户的线索质量难题
B2B 目录采集听起来像是一个简单任务:拿到企业名录、门店信 ...
Xyla Huxley
2026-07-15
差评不是客服问题,而是产品路线图信号:评价与舆情采集客户如何找出真实用户痛点
很多品牌把评论当作客服部门的工作:有差评就回复,有问答就补充 ...
Xyla Huxley
2026-07-15
How to Use a ChatGPT Proxy: Step-by-Step Setup, Tips & Safe Alternatives
ChatGPT Proxy lets you send your ChatGPT traffic throug […]
Unknown
2026-07-14
Residential Proxies for SEO Monitoring And Accurate SERP Tracking
Residential proxies for seo monitoring help you collect […]
Unknown
2026-07-14
What Is a Mobile Proxy and How It Works
A mobile proxy routes your int ...
Xyla Huxley
2026-07-14