TechCrunch публикует десятки материалов в день о стартапах, раундах финансирования, запусках продуктов и людях, формирующих технологическую индустрию. Каждая статья содержит компактный набор публичных метаданных, которые действительно нужны трекеру трендов, дашборду маркетинговых исследований или мониторингу редакции: заголовок, автор, дата публикации, категория и теги, URL статьи и краткий анонс. Загвоздка в том, что TechCrunch работает на защищённой платформе WordPress, которая быстро выявляет автоматизированный трафик, поэтому наивный скрапер получает блокировку или вызов ещё до того, как успевает собрать что-либо полезное.
В этом руководстве показано, как скрапить TechCrunch с помощью Python надёжным способом. Вы создадите небольшой работающий скрапер, который получает страницу листинга через Crawling API, разбирает каждую карточку статьи с помощью BeautifulSoup и выводит чистые структурированные данные. Весь процесс ограничен публичными метаданными статей (не полными текстами), а раздел о правовых аспектах ближе к концу не является формальностью. Прочитайте его перед запуском на реальных объёмах.
Что вы создадите
Python-скрипт, который принимает публичный URL листинга TechCrunch, получает HTML через Crawling API и извлекает структурированную запись для каждой статьи на странице. В качестве рабочего примера используется лента главной страницы TechCrunch, из каждой карточки извлекаются следующие поля:
- Заголовок, название статьи в том виде, в каком оно отображается в листинге.
- URL статьи, ссылка на отдельный материал.
- Автор, имя автора, указанное в карточке.
-
Дата публикации, машиночитаемая метка времени из атрибута
datetime. - Категория и теги, раздел или тема, к которым относится статья.
- Анонс, краткое резюме, отображаемое под заголовком.
Почему обычный запрос не работает на TechCrunch
Можно направить Python-библиотеку requests на URL TechCrunch и иногда получить HTML обратно, но в реальном скрапинге это редко остаётся таким простым. TechCrunch расположен за граничным слоем, который отслеживает трафик с признаками скрапера, и два фактора работают против вас. Во-первых, IP-адреса датацентров и паттерны запросов, которые не похожи на реальный браузер, ограничиваются по скорости или получают вызов уже после первых нескольких запросов, а повторные обращения с одного адреса быстро превышают этот порог. Во-вторых, некоторые листинги и ленты заполняют контент с помощью JavaScript, поэтому в полученном сыром HTML могут отсутствовать нужные вам карточки.
Таким образом, надёжный скрапер TechCrunch требует двух вещей в одном запросе: IP-адрес, который платформа воспринимает как реального посетителя, и там, где представление рендерится на клиенте, браузер, который действительно запускает скрипты страницы. Вы можете собрать это самостоятельно с пулом ротируемых IP и головным браузером, но поддержание такой инфраструктуры составляет большую часть работы. Crawling API объединяет всё в одном вызове: вы отправляете URL, он получает страницу через доверенный ротируемый IP, при необходимости рендерит JavaScript и возвращает готовый HTML для разбора.
Crawlbase предлагает два типа токенов. Обычный токен получает статический HTML; JavaScript (JS) токен сначала рендерит страницу в реальном браузере. Листинги TechCrunch в основном представляют собой серверно-рендеримую разметку WordPress, поэтому обычного токена здесь обычно достаточно. Если конкретная лента возвращает пустые карточки, переключитесь на JS токен для рендеринга. Вы можете начать с до 20 000 бесплатных запросов без банковской карты.
Предварительные требования
Перед написанием кода необходимо подготовить несколько вещей. Ни одна из них не займёт много времени.
Базовый Python. Вы должны уметь писать и запускать Python-скрипты и устанавливать пакеты с помощью pip. Если BeautifulSoup для вас нова, наше руководство по использованию BeautifulSoup в Python охватывает основы разбора, которые предполагает этот туториал.
Python 3.8 или выше. Проверьте версию командой python --version. Если её нет, установите с python.org или через дистрибутив, например Anaconda.
Аккаунт Crawlbase и токен. Зарегистрируйтесь, откройте дашборд и скопируйте обычный токен со страницы документации аккаунта. Обращайтесь с токеном как с паролем: он аутентифицирует ваши запросы, поэтому не добавляйте его в систему контроля версий.
Настройка проекта
Создайте виртуальное окружение, чтобы зависимости проекта оставались изолированными, затем установите библиотеки, необходимые скраперу.
python --version python -m venv techcrunch_env source techcrunch_env/bin/activate pip install crawlbase beautifulsoup4 pandas
В Windows активируйте окружение с помощью techcrunch_env\Scripts\activate вместо строки с source. Три зависимости выполняют всю работу: crawlbase, официальный клиент для Crawling API, beautifulsoup4 разбирает полученный HTML, позволяя извлекать отдельные поля по CSS-селекторам, а pandas упрощает запись записей в CSV в конце.
Шаг 1: получение страницы листинга
Начните с получения страницы. Импортируйте класс CrawlingAPI, инициализируйте его токеном и запросите URL листинга. Проверка статуса перед разбором гарантирует, что сбои будут явными, а не скрытыми.
from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def crawl(page_url): options = {"country": "US"} response = api.get(page_url, options) if response["status_code"] == 200: return response["body"].decode("utf-8") print(f"Request failed: {response['status_code']}") return None if __name__ == "__main__": page_url = "https://techcrunch.com" html = crawl(page_url) print(html[:500] if html else "No HTML returned")
Опция country привязывает запрос к выходному IP в США, что важно, поскольку TechCrunch может отдавать разный контент в зависимости от региона. Запустите скрипт командой python scraper.py, и в первых 500 символах вы должны увидеть реальную разметку статей, а не страницу блокировки или пустую оболочку. Это подтверждает, что получение работает за доверенным IP, прежде чем вы напишете хоть один селектор. Если карточки возвращаются пустыми, перезапустите с JS токеном для рендеринга страницы, как описано в блоке выше.
TechCrunch быстро блокирует IP-адреса датацентров, и тот статус 200, который вы только что проверили, надёжен только тогда, когда запрос исходит с адреса, которому доверяет платформа. Crawling API ротирует жилые IP на серверной стороне, при необходимости рендерит JavaScript и отдаёт готовый HTML, избавляя вас от необходимости содержать флот головных браузеров и пул прокси. Сначала попробуйте на публичной странице листинга на бесплатном тарифе.
Шаг 2: разбор карточек статей с помощью BeautifulSoup
Имея HTML, загрузите его в BeautifulSoup и извлеките каждую статью по её селектору. TechCrunch организует листинги в виде повторяющихся блоков, поэтому вы один раз выбираете все контейнеры статей, а затем считываете одни и те же поля из каждого. В разметке WordPress каждая статья находится внутри контейнера с классом wp-block-tc23-post-picker, по которому вы итерируете. Проверьте актуальные имена классов в инструментах разработчика вашего браузера на живой странице, поскольку разметка со временем меняется.
from bs4 import BeautifulSoup def text_of(node, selector): found = node.select_one(selector) return found.get_text(strip=True) if found else "" def parse_listings(html): soup = BeautifulSoup(html, "html.parser") cards = soup.select("div.wp-block-tc23-post-picker") articles = [] for card in cards: title_el = card.select_one("h2.wp-block-post-title") link_el = title_el.select_one("a") if title_el else None time_el = card.select_one("time") articles.append({ "headline": title_el.get_text(strip=True) if title_el else "", "url": link_el["href"] if link_el else "", "author": text_of(card, "div.wp-block-tc23-author-card-name"), "publish_date": time_el["datetime"] if time_el else "", "category": text_of(card, "div.wp-block-tc23-post-picker__category a"), "excerpt": text_of(card, "p.wp-block-post-excerpt__excerpt"), }) return articles
Два паттерна делают код устойчивым. Вспомогательная функция text_of возвращает пустую строку вместо исключения, когда селектор ничего не находит, поэтому одна неправильно сформированная карточка не прерывает весь процесс. А чтение даты публикации из атрибута datetime тега <time> даёт чистую ISO-метку времени, а не удобочитаемый текст, отображаемый в карточке, что намного удобнее для сортировки и фильтрации. Селектор категории указывает на маленькую тематическую ссылку над каждым заголовком; карточка без категории возвращает пустую строку.
Шаг 3: полный скрипт
Теперь объедините получение и разбор в один запускаемый файл, направьте его на ленту главной страницы и запишите записи на диск. Функция main связывает части вместе и сохраняет CSV с помощью pandas, чтобы результат сразу попадал в таблицу или ноутбук.
import json import pandas as pd from bs4 import BeautifulSoup from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def crawl(page_url): response = api.get(page_url, {"country": "US"}) if response["status_code"] == 200: return response["body"].decode("utf-8") print(f"Request failed: {response['status_code']}") return None def text_of(node, selector): found = node.select_one(selector) return found.get_text(strip=True) if found else "" def parse_listings(html): soup = BeautifulSoup(html, "html.parser") cards = soup.select("div.wp-block-tc23-post-picker") articles = [] for card in cards: title_el = card.select_one("h2.wp-block-post-title") link_el = title_el.select_one("a") if title_el else None time_el = card.select_one("time") articles.append({ "headline": title_el.get_text(strip=True) if title_el else "", "url": link_el["href"] if link_el else "", "author": text_of(card, "div.wp-block-tc23-author-card-name"), "publish_date": time_el["datetime"] if time_el else "", "category": text_of(card, "div.wp-block-tc23-post-picker__category a"), "excerpt": text_of(card, "p.wp-block-post-excerpt__excerpt"), }) return articles def main(): page_url = "https://techcrunch.com" html = crawl(page_url) if not html: return articles = parse_listings(html) print(json.dumps(articles[:3], indent=2)) pd.DataFrame(articles).to_csv("techcrunch_listing.csv", index=False) print(f"Saved {len(articles)} articles") if __name__ == "__main__": main()
Это весь скрапер. Он получает ленту главной страницы, разбирает каждую карточку в запись с шестью публичными полями, выводит первые три как JSON и записывает полный набор в techcrunch_listing.csv. Замените page_url на любой публичный листинг, например ленту категории или тегов, и тот же парсер справится с ним.
Как выглядит результат
Запустите полный скрипт командой python scraper.py, и вы получите чистую структурированную запись для каждой статьи, готовую для записи в JSON, CSV или базу данных.
[ { "headline": "Open source tools to boost your productivity", "url": "https://techcrunch.com/2024/08/11/a-not-quite-definitive-guide-to-open-source-alternative-software/", "author": "Paul Sawers", "publish_date": "2024-08-11T09:00:00-07:00", "category": "Apps", "excerpt": "TechCrunch has pulled together some open-source alternatives to popular productivity apps." }, { "headline": "Oyo valuation crashes over 75% in new funding", "url": "https://techcrunch.com/2024/08/11/oyo-valuation-crashes-over-75-in-new-funding/", "author": "Manish Singh", "publish_date": "2024-08-11T06:07:12-07:00", "category": "Fintech", "excerpt": "The valuation of Oyo, once India's second-most valuable startup at $10 billion, has dipped to $2.4 billion." } ]
Обратите внимание, что анонс является кратким резюме, а не полным текстом статьи. Это сделано намеренно. Карточка листинга раскрывает тизер, а окружающие метаданные представляют собой именно те публичные сигналы, которые нужны для отслеживания трендов, без копирования самого редакционного текста.
Перебор страниц и управление темпом запросов
Один листинг, это демо; реальная задача охватывает множество страниц. TechCrunch разбивает ленты на страницы по простому URL-шаблону: главная страница, это https://techcrunch.com, а следующие, https://techcrunch.com/page/2/, https://techcrunch.com/page/3/ и так далее. Структура остаётся той же: формируйте URL каждой страницы, получайте её через Crawling API, разбирайте той же функцией и собирайте строки. Выдержка пауз между запросами обеспечивает стабильность длинных прогонов.
import time def scrape_pages(num_pages=5): results = [] for page in range(1, num_pages + 1): url = "https://techcrunch.com" if page == 1 else f"https://techcrunch.com/page/{page}/" print(f"Scraping page {page}") html = crawl(url) if html: results.extend(parse_listings(html)) time.sleep(3) return results
Вызов time.sleep распределяет запросы во времени, чтобы вы не забрасывали TechCrunch плотным потоком. Поскольку все страницы имеют одинаковую структуру карточек, написанный вами парсер работает на всех них без изменений, и вы передаёте объединённый список в тот же вызов to_csv из полного скрипта.
Сохранение доступа
Даже при доверенном IP для получения данных TechCrunch отслеживает трафик с признаками скрапера. Несколько привычек помогут поддерживать стабильность прогона; они применимы к любой защищённой цели.
- Контролируйте темп запросов. Бомбардировка страниц листинга плотным потоком, самый быстрый способ получить ограничение. Распределяйте запросы и варьируйте цели вместо того, чтобы обходить одну ленту на полной скорости.
- Используйте ротацию. Пул жилых IP распределяет запросы по множеству адресов реальных пользователей, чтобы ни один из них не превысил ограничение скорости. Crawling API делает это за вас; если вы строите собственный стек, именно здесь нужно сосредоточить усилия.
- Следите за кодами статусов. Прогон, начинающий возвращать вызовы или ошибки, сигнализирует о том, что текущая скорость или уровень IP больше не подходит. Воспринимайте это как сигнал к замедлению, а не как шум, который можно игнорировать.
За более широким руководством обратитесь к статье как скрапить сайты без блокировок и углублённому разбору как обходить CAPTCHA при веб-скрапинге. Если конкретная лента рендерится на клиенте, наше руководство по скрапингу JavaScript-страниц с помощью Python объясняет, почему рендеринг важен. А если вы предпочитаете маршрутизировать собственный трафик через ротируемый пул, а не использовать управляемый API, Smart AI Proxy (также называемый AI Proxy) предоставляет ту же ротацию жилых IP в качестве drop-in прокси-эндпоинта.
Легален ли скрапинг TechCrunch?
Допустимость скрапинга TechCrunch зависит от условий использования сайта, вашей юрисдикции и того, что вы делаете с данными. Условия TechCrunch ограничивают автоматизированный доступ, а его контент является охраняемым авторским правом редакционным материалом, поэтому правовая картина здесь уже, чем на сайте с публичными листингами. Ни один из примеров кода в этом руководстве не меняет этого; он лишь обеспечивает техническую часть. Прочитайте Условия использования TechCrunch и его robots.txt и относитесь к обоим как к границе того, что вы собираете.
Линия, которая делает это обоснованным, это разница между метаданными и самими статьями. Сбор публичных метаданных: заголовка, автора, даты публикации, категории и тегов, URL статьи и краткого анонса для исследований или анализа трендов представляет собой значительно более лёгкое использование, чем копирование полных текстов статей. Не публикуйте и не распространяйте редакционный текст TechCrunch повторно: это охраняемый авторским правом медиаконтент, и его перепост прямо нарушает как условия использования, так и законодательство об авторском праве. Если вам нужны основные материалы в масштабе, правильный путь, лицензия на контент или официальное соглашение, а не более хитрый скрапер.
Стоит также знать, что TechCrunch работает на WordPress, а это означает более лёгкий официальный путь для большей части этих данных. TechCrunch публикует RSS-ленты и предоставляет WordPress REST API по адресу /wp-json/wp/v2/posts, который возвращает последние записи в виде структурированного JSON, включая заголовки, ссылки, даты и анонсы, без скрапинга отрендеренной страницы. Предпочитайте эти эндпоинты, когда они покрывают ваши потребности, и соблюдайте любые объявленные ими ограничения скорости. Данное руководство ограничено публичными страницами листинга и метаданными; оно не касается ничего за логином, персональных данных или полнотекстового перераспределения.
Ключевые выводы
- TechCrunch блокирует трафик с признаками скрапера. Обычный запрос быстро ограничивается по скорости или получает вызов, поэтому данные получают за доверенным ротируемым IP.
- Crawling API берёт на себя сложную часть. Один вызов получает страницу за жилым IP, при необходимости рендерит JavaScript и возвращает готовый HTML для разбора.
-
BeautifulSoup выполняет извлечение. Выбирайте каждую карточку
wp-block-tc23-post-picker, затем считывайте заголовок, URL, автора, дату публикации, категорию и анонс из каждой, и ожидайте, что селекторы со временем изменятся. -
Читайте дату из атрибута. Атрибут
datetimeтега<time>даёт чистую ISO-метку времени, которая значительно удобнее для сортировки и фильтрации, чем отображаемый текст. - Оставайтесь в рамках публичных метаданных. Соблюдайте ToS и robots.txt, предпочитайте RSS-ленты TechCrunch и WordPress REST API и никогда не перепубликуйте полные тексты статей.
Часто задаваемые вопросы
Почему обычный запрос блокируется на TechCrunch?
TechCrunch расположен за граничным слоем, который выявляет автоматизированный трафик. IP-адреса датацентров и паттерны запросов, не похожие на реальный браузер, ограничиваются по скорости или получают вызов после нескольких запросов, поэтому обычный цикл с requests быстро перестаёт работать. Получение через Crawling API маршрутизирует запрос через жилой IP, который платформа воспринимает как реального посетителя, что и обеспечивает продолжение прогона.
Нужен ли обычный токен или JS токен для TechCrunch?
Обычно обычный токен. Листинги TechCrunch в основном представляют собой серверно-рендеримую разметку WordPress, поэтому статический HTML, возвращаемый обычным токеном, уже содержит карточки статей. Если конкретная лента возвращает пустые карточки, переключитесь на JS токен, который рендерит страницу в реальном браузере перед возвратом HTML.
Какие поля можно извлечь из листинга TechCrunch?
Публичные метаданные из каждой карточки: заголовок, URL статьи, имя автора, дату публикации из атрибута datetime тега <time>, категорию или тег, к которым относится статья, и краткий анонс под заголовком. Данное руководство ограничено этими метаданными и не извлекает полные тексты статей, которые защищены авторским правом.
Есть ли официальный API вместо скрапинга?
Да. TechCrunch работает на WordPress, поэтому публикует RSS-ленты и предоставляет WordPress REST API по адресу /wp-json/wp/v2/posts, который возвращает последние записи в виде структурированного JSON с заголовками, ссылками, датами и анонсами. Предпочитайте эти эндпоинты, когда они покрывают ваши потребности, поскольку они являются более лёгким официальным путём и не требуют рендеринга.
Мои селекторы возвращают пустые значения для каждой карточки. Что изменилось?
Почти наверняка разметка TechCrunch. Имена классов блоков WordPress, такие как wp-block-tc23-post-picker, меняются без предупреждения, поэтому селекторы, работавшие в прошлом месяце, могут сломаться. Повторно проверьте живую статью в инструментах разработчика браузера и обновите селекторы. Периодическое обслуживание селекторов, это норма для любого производственного скрапера.
Как избежать блокировки при скрапинге TechCrunch?
Держите скорость запросов на IP низкой, варьируйте цели вместо цикличного обхода одной ленты и маршрутизируйте через ротируемые жилые IP, чтобы ни один адрес не превысил ограничение скорости. Crawling API управляет ротацией и доверенным пулом IP за вас; если вы строите собственный стек, именно в это и стоит инвестировать. Следите за кодами статусов и замедляйтесь, когда начинают появляться вызовы.
Обходите любой сайт в масштабе, без борьбы с инфраструктурой.
Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.
