# Python Social Media Crawling in 2026: DIY vs One API Call (https://www.socialcrawl.dev/blog/python-social-media-crawling)
> Two ways to crawl social data with Python in 2026: build it with requests and BeautifulSoup, or call a unified API with one httpx.get(). When each wins.
There are two ways to crawl social data with Python in 2026: build a crawler with `requests` and `BeautifulSoup`, or call a unified API from Python. Build it yourself and you fight TLS fingerprinting, datacenter-IP blocks, JS hydration, and rotating internal params forever. The unified path is one `httpx.get()`. This post walks both, with code you can run. For platform deep-dives, see [TikTok crawling](/blog/tiktok-data-without-api) and [Instagram scraping](/blog/instagram-scraping-2026).
## The two paths of Python crawling
Say "Python crawling" and most people picture `requests` fetching a page and `BeautifulSoup` parsing it. For blogs, news, and wikis that ship complete HTML, that is still the right answer. Social platforms are the problem. TikTok, Instagram, and YouTube ship near-empty HTML, and the real data (followers, view counts) lives inside JSON that JavaScript renders later. They also block automated requests aggressively.
| Aspect | DIY crawler (`requests` + `BeautifulSoup`) | Unified API (`httpx.get`) |
| ------------ | ------------------------------------------ | ------------------------- |
| Time to data | Hours to days | About 5 minutes |
| Anti-bot | You manage proxies, TLS, CAPTCHA | Vendor handles it |
| Schema | Different per platform, write adapters | One schema, 43 platforms |
| Maintenance | Fix selectors every 3-6 weeks, forever | Vendor owns it |
| Cost | Proxies (about $10/GB) + engineer time | 1 credit per request |
## requests and BeautifulSoup, by hand
The familiar starting point. For static HTML it is done in ten lines.
```python title="scrape_diy.py"
from bs4 import BeautifulSoup
# Plain requests + BeautifulSoup. Works fine on complete HTML pages.
res = requests.get("https://example.com/blog")
soup = BeautifulSoup(res.text, "html.parser")
titles = [h2.get_text(strip=True) for h2 in soup.select("h2")]
print(titles)
# On social platforms this same code breaks:
# - requests has a non-browser TLS fingerprint, so you get a 403
# - followers/views live in JS-rendered JSON, not in the HTML
# - datacenter IPs get banned within minutes
```
Point the same code at a TikTok profile and the response is an empty shell or a 403. Swapping `requests` for `httpx` changes nothing: neither looks like a browser.
## How social platforms block you
There are four layers, and one is never enough.
First, TLS fingerprinting. Platforms read the handshake and tell real Chrome from a Python library, so you need [`curl_cffi`](https://github.com/lexiforest/curl_cffi) to impersonate Chrome. Second, IP: datacenter IPs get blocked on the first request, so residential proxies at roughly $10/GB are effectively required, and 10k requests/day is a realistic $50-100/month in bandwidth. Third, hydration: TikTok renders public pages as JSON inside a `