# 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 | Building a Python social media crawler by hand with requests and BeautifulSoup ## 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 `