Situs berita adalah salah satu sumber daya yang paling dilindungi di internet. Cloudflare, pembatasan laju, pemblokiran berdasarkan IP — semua ini menjadikan pengambilan berita sebagai tantangan teknis yang serius. Dalam panduan ini, kita akan membahas cara mengatur proksi dengan benar untuk pengumpulan data yang stabil dari portal berita, jenis proksi apa yang harus dipilih untuk berbagai tugas, dan bagaimana menghindari sistem perlindungan modern.
Mengapa situs berita memblokir pengambil data
Portal berita sangat sensitif terhadap pengumpulan data otomatis karena beberapa alasan. Pertama, konten adalah aset utama mereka yang dimonetisasi melalui iklan dan langganan. Pengambilan data massal memungkinkan pesaing untuk menyalin materi dan mengurangi kunjungan unik. Kedua, beban tinggi dari bot meningkatkan biaya untuk server dan CDN.
Situs berita modern menggunakan perlindungan berlapis:
- Cloudflare dan sejenisnya — memeriksa JavaScript, sidik jari TLS browser, pola perilaku
- Pembatasan laju — membatasi jumlah permintaan dari satu IP (biasanya 10-50 permintaan per menit)
- Pemblokiran berdasarkan User-Agent — memblokir header standar dari pustaka (Python-requests, curl)
- CAPTCHA — ditampilkan saat aktivitas mencurigakan terdeteksi
- Geoblocking — beberapa portal berita hanya dapat diakses dari negara tertentu
Tanda-tanda umum yang digunakan situs berita untuk mendeteksi pengambil data: IP yang sama membuat banyak permintaan berturut-turut, tidak ada JavaScript, urutan header HTTP yang tidak standar, kecepatan permintaan yang terlalu cepat (manusia tidak dapat membuka 10 halaman per detik), tidak ada cookies dan referrer.
Penting: Pengambilan data dari situs berita berada di zona abu-abu. Selalu periksa robots.txt dan Ketentuan Layanan dari sumber yang ditargetkan. Untuk penggunaan data komersial, disarankan untuk menggunakan API resmi atau menjalin perjanjian kemitraan.
Jenis proksi apa yang harus dipilih untuk pengambilan berita
Pemilihan jenis proksi tergantung pada skala tugas, anggaran, dan tingkat perlindungan situs yang ditargetkan. Mari kita bahas tiga opsi utama dan penerapannya untuk pengambilan berita.
| Jenis proksi | Kecepatan | Biaya | Kapan digunakan |
|---|---|---|---|
| Proksi pusat data | Tinggi (50-100 ms) | Rendah | Situs tanpa Cloudflare, volume data besar, pengujian |
| Proksi residensial | Sedang (200-500 ms) | Tinggi | Situs dengan Cloudflare, perlindungan ketat, geotargeting |
| Proksi seluler | Sedang (300-600 ms) | Sangat tinggi | Perlindungan maksimal, versi seluler dari situs berita |
Proksi pusat data untuk pengambilan berita
Cocok untuk pengambilan situs berita tanpa perlindungan serius: penerbit regional, blog, portal informasi kecil. Keuntungannya: kecepatan tinggi (penting saat mengambil dari ratusan sumber), biaya rendah (dapat menyewa kumpulan 50-100 IP), koneksi stabil.
Kekurangan: mudah terdeteksi berdasarkan ASN (kepemilikan pusat data), sering kali sudah masuk dalam daftar hitam situs besar, tidak dapat melewati Tantangan Cloudflare dalam 70% kasus. Gunakan proksi pusat data untuk pengambilan massal umpan RSS, sitemap.xml, API endpoints, atau untuk mengumpulkan metadata (judul, tanggal publikasi) tanpa mengunduh konten lengkap.
Proksi residensial — standar emas
Proksi residensial adalah alamat IP dari pengguna rumah nyata yang disediakan oleh penyedia layanan internet. Untuk situs berita, mereka terlihat seperti pengunjung biasa, yang sangat penting saat bekerja dengan sumber daya yang dilindungi.
Ketika proksi residensial menjadi wajib: pengambilan dari portal berita besar (CNN, BBC, Reuters, RBK, Kommersant), situs di belakang Cloudflare atau perlindungan serupa, pengumpulan data dari negara tertentu (geotargeting), sesi panjang dengan otorisasi. Proksi residensial dapat melewati pemeriksaan JavaScript Cloudflare, memiliki reputasi IP yang bersih, dan mendukung sesi lengket (penetapan IP selama 10-30 menit).
Tips praktis: gunakan proksi residensial dengan rotasi berdasarkan waktu (sesi lengket), bukan berdasarkan permintaan. Misalnya, satu IP bekerja selama 10 menit, mengumpulkan 20-30 artikel, lalu berubah. Ini terlihat lebih alami daripada mengganti IP untuk setiap permintaan.
Proksi seluler untuk kasus khusus
Proksi seluler menggunakan IP dari operator seluler (MTS, Beeline, Tele2). Mereka memiliki tingkat kepercayaan maksimum, karena jutaan orang menggunakan internet seluler untuk membaca berita. Gunakan mereka untuk pengambilan versi seluler dari situs berita (sering kali memiliki perlindungan yang lebih sederhana), situs dengan perlindungan yang sangat ketat, halaman AMP Google News.
Ciri khas proksi seluler: IP sering berubah secara otomatis (operator seluler menggunakan CGNAT), satu IP dapat digunakan oleh ratusan pengguna secara bersamaan, yang membuat pemblokiran menjadi tidak berarti. Kekurangan — harga tinggi, jadi gunakan mereka secara selektif, hanya untuk tujuan yang paling dilindungi.
Menghindari Cloudflare dan sistem anti-bot lainnya
Cloudflare adalah musuh utama pengambil data situs berita. Sekitar 40% portal berita besar menggunakan Cloudflare untuk melindungi dari bot. Pustaka standar (requests, urllib) tidak dapat melewati pemeriksaan, karena Cloudflare menganalisis sidik jari TLS, eksekusi JavaScript, urutan header HTTP, pola perilaku.
Strategi untuk menghindari Cloudflare
1. Browser tanpa kepala (Selenium, Playwright, Puppeteer)
Meniru browser nyata dengan eksekusi JavaScript. Cloudflare melihat sidik jari TLS Chrome/Firefox yang benar dan melewatkan permintaan. Kekurangan: lambat (2-5 detik per halaman), membutuhkan banyak sumber daya (RAM, CPU).
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Pengaturan proksi untuk Selenium
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://username:password@proxy.example.com:8080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://news-site.com/article')
# Menunggu pemuatan JavaScript
driver.implicitly_wait(10)
html = driver.page_source
driver.quit()
2. Pustaka dengan TLS-fingerprinting (curl_cffi, tls-client)
Meniru sidik jari TLS dari browser nyata tanpa menjalankan browser tanpa kepala. Bekerja 10-20 kali lebih cepat daripada Selenium, tetapi tidak menjalankan JavaScript. Cocok untuk situs dengan pemeriksaan dasar Cloudflare (tanpa tantangan JS).
from curl_cffi import requests
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
response = requests.get(
'https://news-site.com/article',
proxies=proxies,
impersonate='chrome110' # Meniru sidik jari TLS Chrome 110
)
print(response.text)
3. Layanan penghindaran Cloudflare (scraperapi, scrapingbee)
API berbayar yang secara otomatis menghindari Cloudflare. Anda mengirimkan URL, mereka mengembalikan HTML yang siap pakai. Kelebihan: tidak perlu memahami detail teknis, rotasi proksi otomatis, pemrosesan CAPTCHA. Kekurangan: mahal untuk volume besar (mulai dari $50/bulan untuk 100K permintaan).
Header HTTP yang benar
Bahkan dengan proksi, penting untuk mengirimkan header yang benar, jika tidak, situs akan mendeteksi bot berdasarkan User-Agent yang tidak standar atau tidak adanya Accept-Language.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'Accept-Encoding': 'gzip, deflate, br',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Cache-Control': 'max-age=0'
}
Secara berkala perbarui User-Agent — gunakan versi terbaru dari browser. Periksa sidik jari Anda di situs whoer.net atau browserleaks.com.
Pengaturan rotasi IP dan manajemen permintaan
Rotasi proksi yang benar adalah kunci untuk pengambilan data yang stabil tanpa pemblokiran. Situs berita melacak frekuensi permintaan dari satu IP, dan melebihi batas akan mengakibatkan pemblokiran sementara atau permanen.
Jenis rotasi proksi
Rotasi berdasarkan permintaan — setiap permintaan dilakukan melalui IP baru. Cocok untuk pengambilan cepat dari banyak situs yang berbeda, meminimalkan risiko pemblokiran berdasarkan frekuensi permintaan. Kekurangan: tidak cocok untuk situs dengan sesi (cookies, otorisasi), dapat terlihat mencurigakan bagi beberapa perlindungan.
Rotasi berdasarkan waktu (sesi lengket) — satu IP digunakan selama waktu tetap (5-30 menit), kemudian berubah. Cocok untuk pengambilan dari satu portal berita dengan banyak halaman, mempertahankan cookies dan sesi, terlihat seperti perilaku pengguna nyata. Disarankan untuk sebagian besar tugas pengambilan berita.
Rotasi berdasarkan geolokasi — perubahan IP dari negara/kota yang berbeda. Digunakan untuk pengambilan konten yang bergantung pada lokasi (berita regional), menghindari geoblocking.
Frekuensi permintaan yang optimal
Bahkan dengan rotasi proksi, jangan melakukan permintaan terlalu sering. Interval aman untuk berbagai jenis situs:
- Portal berita besar (RBK, Kommersant, Vedomosti) — 2-5 detik antara permintaan dari satu IP
- Situs menengah — 1-3 detik
- Blog kecil dan penerbit regional — 0.5-1 detik
Tambahkan penundaan acak (randomization) agar pola permintaan terlihat alami:
import time
import random
def fetch_article(url, proxies):
response = requests.get(url, proxies=proxies, headers=headers)
# Penundaan acak dari 2 hingga 5 detik
delay = random.uniform(2, 5)
time.sleep(delay)
return response.text
Contoh rotasi proksi dari kumpulan
Jika Anda memiliki daftar proksi, Anda dapat menerapkan rotasi sederhana secara manual:
import itertools
import requests
# Kumpulan proksi
proxy_list = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
]
# Membuat iterator tak terbatas
proxy_pool = itertools.cycle(proxy_list)
def get_next_proxy():
proxy = next(proxy_pool)
return {'http': proxy, 'https': proxy}
# Penggunaan
urls = ['https://news1.com/article', 'https://news2.com/article']
for url in urls:
proxies = get_next_proxy()
response = requests.get(url, proxies=proxies, headers=headers)
print(f'Fetched {url} via {proxies["http"]}')
Contoh kode: Python + Scrapy + proksi
Scrapy adalah kerangka kerja profesional untuk pengambilan data yang secara bawaan mendukung proksi, middleware, rotasi, dan penanganan kesalahan. Mari kita lihat contoh lengkap pengambil data situs berita dengan rotasi proksi.
Instalasi dependensi
pip install scrapy scrapy-rotating-proxies
Pengaturan Scrapy dengan proksi (settings.py)
# settings.py
# Mengaktifkan middleware untuk rotasi proksi
ROTATING_PROXY_LIST = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
]
DOWNLOADER_MIDDLEWARES = {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
# Pengaturan untuk menghindari pemblokiran
CONCURRENT_REQUESTS = 8 # Tidak lebih dari 8 permintaan bersamaan
DOWNLOAD_DELAY = 2 # Penundaan 2 detik antara permintaan
RANDOMIZE_DOWNLOAD_DELAY = True # Penundaan acak
# User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
# Upaya ulang saat terjadi kesalahan
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]
Spider untuk pengambilan berita
# news_spider.py
import scrapy
from datetime import datetime
class NewsSpider(scrapy.Spider):
name = 'news_parser'
# Daftar situs berita untuk pengambilan
start_urls = [
'https://example-news.com/latest',
]
def parse(self, response):
# Mengambil daftar artikel di halaman utama
articles = response.css('article.news-item')
for article in articles:
article_url = article.css('a.title::attr(href)').get()
if article_url:
# Mengunjungi halaman artikel
yield response.follow(article_url, callback=self.parse_article)
def parse_article(self, response):
# Mengambil data artikel
yield {
'url': response.url,
'title': response.css('h1.article-title::text').get(),
'date': response.css('time.published::attr(datetime)').get(),
'author': response.css('span.author::text').get(),
'text': ' '.join(response.css('div.article-body p::text').getall()),
'tags': response.css('a.tag::text').getall(),
'scraped_at': datetime.now().isoformat(),
}
Menjalankan pengambil data
# Menyimpan ke JSON
scrapy crawl news_parser -o news_data.json
# Menyimpan ke CSV
scrapy crawl news_parser -o news_data.csv
Pengambil data sederhana dengan requests + BeautifulSoup
Jika tidak memerlukan logika yang kompleks, Anda dapat menggunakan kombinasi requests + BeautifulSoup:
import requests
from bs4 import BeautifulSoup
import time
import random
# Pengaturan proksi
proxies = {
'http': 'http://user:pass@proxy.example.com:8080',
'https': 'http://user:pass@proxy.example.com:8080'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def parse_news_article(url):
try:
response = requests.get(url, proxies=proxies, headers=headers, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Mengambil data (selector tergantung pada situs)
title = soup.find('h1', class_='article-title').text.strip()
date = soup.find('time', class_='published')['datetime']
text = ' '.join([p.text for p in soup.find_all('p', class_='article-text')])
return {
'url': url,
'title': title,
'date': date,
'text': text
}
except Exception as e:
print(f'Error parsing {url}: {e}')
return None
# Mengambil daftar artikel
urls = [
'https://news-site.com/article-1',
'https://news-site.com/article-2',
]
for url in urls:
article_data = parse_news_article(url)
if article_data:
print(article_data)
# Penundaan antara permintaan
time.sleep(random.uniform(2, 4))
Kesalahan umum saat mengambil berita
Bahkan dengan pengaturan proksi yang benar, pengambil data sering kali mendapatkan pemblokiran karena kesalahan teknis. Mari kita bahas masalah yang paling umum dan solusinya.
Kesalahan 1: Frekuensi permintaan terlalu tinggi
Gejala: HTTP 429 (Terlalu Banyak Permintaan), pemblokiran sementara IP, CAPTCHA. Penyebab: pengambil data melakukan 10-50 permintaan per detik dari satu IP. Solusi: tambahkan penundaan (time.sleep()), gunakan DOWNLOAD_DELAY di Scrapy, batasi CONCURRENT_REQUESTS.
Kesalahan 2: Menggunakan satu proksi untuk semua permintaan
Gejala: proksi cepat diblokir, bahkan dengan penundaan. Penyebab: satu IP melakukan ratusan permintaan ke satu situs. Solusi: gunakan kumpulan proksi dengan rotasi, untuk situs besar — minimal 10-20 proksi, untuk sesi lengket ganti IP setiap 10-15 menit.
Kesalahan 3: Mengabaikan cookies
Banyak situs berita mengatur cookies saat kunjungan pertama dan memeriksa keberadaannya dalam permintaan berikutnya. Tidak adanya cookies adalah tanda bot. Solusi: gunakan requests.Session() untuk menyimpan cookies secara otomatis, di Scrapy aktifkan COOKIES_ENABLED = True.
import requests
session = requests.Session()
session.proxies = {'http': 'http://proxy.com:8080', 'https': 'http://proxy.com:8080'}
# Permintaan pertama — mendapatkan cookies
response1 = session.get('https://news-site.com')
# Permintaan berikutnya secara otomatis mengirimkan cookies
response2 = session.get('https://news-site.com/article')
Kesalahan 4: Penanganan pengalihan yang salah
Situs berita sering menggunakan pengalihan (301, 302) untuk versi seluler, subdomain regional, halaman AMP. Jika pengambil data tidak mengikuti pengalihan, ia akan mendapatkan halaman kosong. Solusi: di requests sudah diaktifkan secara default (allow_redirects=True), periksa URL akhir melalui response.url.
Kesalahan 5: Mengambil konten dinamis tanpa JavaScript
Banyak situs berita modern memuat konten melalui JavaScript (React, Vue). Pustaka requests mendapatkan kerangka HTML kosong tanpa artikel. Solusi: gunakan Selenium/Playwright untuk menjalankan JavaScript, periksa Network di DevTools — mungkin data dimuat melalui API (dapat diambil langsung JSON).
Skalabilitas: pengambilan dari ratusan sumber
Ketika perlu mengambil tidak hanya satu situs berita, tetapi ratusan sumber secara bersamaan (agregator berita, pemantauan media), dibutuhkan arsitektur yang dapat diskalakan.
Pengambilan terdistribusi dengan Scrapy Cloud
Scrapy Cloud (dari pencipta Scrapy) memungkinkan menjalankan pengambil data di cloud dengan skala otomatis. Keuntungannya: tidak perlu server sendiri, rotasi proksi otomatis, pemantauan dan log. Biaya: mulai dari $9/bulan untuk paket dasar.
Antrian tugas (Celery + Redis)
Untuk penyebaran mandiri, gunakan Celery — sistem tugas terdistribusi. Arsitektur: Redis menyimpan antrian URL untuk pengambilan, beberapa pekerja (server) mengambil tugas dari antrian dan melakukan pengambilan secara paralel, setiap pekerja menggunakan kumpulan proksi mereka sendiri.
# tasks.py
from celery import Celery
import requests
app = Celery('news_parser', broker='redis://localhost:6379/0')
@app.task
def parse_article(url, proxy):
proxies = {'http': proxy, 'https': proxy}
response = requests.get(url, proxies=proxies, timeout=10)
# Pengambilan dan penyimpanan data
return response.text
# Menambahkan tugas ke antrian
urls = ['https://news1.com/article', 'https://news2.com/article']
proxies = ['http://proxy1.com:8080', 'http://proxy2.com:8080']
for url in urls:
proxy = random.choice(proxies)
parse_article.delay(url, proxy) # Eksekusi asinkron
Pemantauan dan penanganan kesalahan
Dalam pengambilan data skala besar, pemantauan sangat penting: berapa banyak URL yang diproses, berapa banyak kesalahan, proksi mana yang diblokir. Gunakan Sentry untuk melacak kesalahan Python, Grafana + Prometheus untuk metrik (permintaan per detik, waktu respons), pencatatan di ELK Stack (Elasticsearch, Logstash, Kibana).
Tips: Buat sistem pemeriksaan otomatis untuk proksi. Setiap 5-10 menit, kirimkan permintaan uji melalui setiap proksi ke whoer.net atau httpbin.org. Jika proksi tidak merespons atau diblokir — kecualikan dari kumpulan dan tambahkan yang baru.
Optimasi biaya proksi
Saat mengambil dari ratusan sumber, biaya proksi dapat mencapai ribuan dolar per bulan. Strategi optimasi: gunakan proksi pusat data untuk situs sederhana (RSS, API), proksi residensial — hanya untuk yang dilindungi, cache data — jangan mengambil artikel yang sama dua kali, ambil di jam non-puncak (malam hari beban situs lebih rendah, risiko pemblokiran lebih sedikit).
Contoh: untuk mengambil 500 situs berita, Anda dapat menggunakan 80% proksi pusat data (untuk RSS dan situs sederhana) dan 20% proksi residensial (untuk 100 portal yang dilindungi teratas). Ini akan mengurangi biaya 3-5 kali lipat.
Kesimpulan
Pengambilan data dari situs berita adalah tugas teknis yang kompleks, yang memerlukan pemilihan proksi yang tepat, pengaturan rotasi, dan penghindaran sistem anti-bot. Kesimpulan kunci dari artikel ini: untuk portal berita yang dilindungi (Cloudflare, pembatasan laju ketat) gunakan proksi residensial dengan sesi lengket, untuk pengambilan massal dari ratusan sumber, proksi pusat data dengan rotasi cepat sangat cocok, selalu tambahkan penundaan antara permintaan (2-5 detik) dan header HTTP yang benar, untuk menghindari Cloudflare gunakan browser tanpa kepala (Selenium, Playwright) atau pustaka dengan TLS-fingerprinting.
Saat melakukan skala, gunakan sistem terdistribusi (Celery, Scrapy Cloud) dan pemantauan kesalahan. Ingatlah bahwa pengambilan data harus etis — patuhi robots.txt, jangan menciptakan beban berlebihan pada server, dan hormati hak cipta konten.
Jika Anda berencana untuk mengambil portal berita besar dengan perlindungan Cloudflare, kami merekomendasikan untuk menggunakan proksi residensial — mereka memberikan tingkat kepercayaan yang tinggi dan risiko pemblokiran yang minimal. Untuk tugas di mana kecepatan dan volume data penting (pengambilan RSS, API endpoints), proksi pusat data sangat cocok.