Skip to content
Intermediate / 3 min read

Cara Menyiapkan Proxy Datacenter Smartproxy di Linux untuk Pemantauan Harga Python

Arahkan permintaan pemantauan harga Python terjadwal melalui proxy datacenter Smartproxy di Linux, dengan kredensial disimpan di luar kode Anda, percobaan ulang dan backoff, panduan rotasi, pencatatan CSV, dan jadwal cron.

Linux SOCKS5 HTTP(S) Web Scraping

Ringkasan

Smartproxy adalah jaringan proxy yang ramah pemula dengan kumpulan residential dan datacenter yang dapat diakses melalui HTTP dan SOCKS5, ditagih dengan model bulanan tetap. Tutorial ini mengarahkan kumpulan datacenter-nya ke pekerjaan konkret yang umum di Linux: pemantauan harga terjadwal dengan Python.

Pemantauan harga cocok untuk IP datacenter. Permintaan cepat, targetnya adalah halaman produk publik, dan beban kerjanya berat baca. Jika pengecer tertentu mulai memblokir rentang datacenter, skrip yang sama dapat dijalankan terhadap kumpulan residential — hanya endpoint dan kredensial yang berubah.

Pada akhirnya Anda akan memiliki:

  • Kredensial disimpan di luar kode sumber Anda
  • Permintaan proxy yang diverifikasi dari baris perintah
  • Skrip Python yang mengambil halaman produk melalui proxy dengan percobaan ulang dan backoff
  • Harga yang ditambahkan ke file CSV dengan stempel waktu
  • Entri cron yang menjalankan pekerjaan sesuai jadwal

Anda tidak memerlukan GUI untuk semua ini. Smartproxy juga menawarkan ekstensi browser, tetapi pekerjaan Linux headless hanya membutuhkan host, port, nama pengguna, dan kata sandi dari dasbor Anda.

Prasyarat

  • Host Linux — perintah di bawah ini berfungsi pada keluarga Debian/Ubuntu dan Fedora/RHEL
  • Python 3.9 atau lebih baru
  • Akun Smartproxy dengan akses proxy datacenter
  • Host, port, nama pengguna, dan kata sandi proxy yang tercantum di dasbor Smartproxy Anda

Datacenter atau Residential?

Kedua jenis kumpulan dikonfigurasi secara identik dalam kode, jadi keputusannya adalah tentang situs target, bukan tentang perkakas.

Faktor Datacenter Residential
Kecepatan per permintaan Cepat Sedang
Biaya per GB Lebih rendah Lebih tinggi
Risiko blokir pada pengecer besar Lebih tinggi Lebih rendah
Paling cocok Pembacaan bervolume tinggi dari situs yang toleran Situs terlindungi dan harga akurat secara geografis

Aturan praktis:

  • Mulai dengan datacenter, karena ini cara yang lebih murah dan cepat untuk membuktikan parser Anda berfungsi.
  • Pindahkan satu target yang membandel ke residential daripada memigrasikan seluruh pekerjaan.
  • Pertahankan skema dan autentikasi proxy tetap identik antar kumpulan sehingga beralih hanya perubahan konfigurasi, bukan penulisan ulang.

Langkah-langkah

Langkah 1 — Ekspor kredensial Anda dan verifikasi endpoint

Tetapkan empat nilai dari dasbor Anda sebagai variabel lingkungan untuk sesi shell saat ini. Ganti placeholder dengan nilai Anda sendiri.

export SMART_HOST="<host-from-dashboard>"
export SMART_PORT="<port-from-dashboard>"
export SMART_USER="<username>"
export SMART_PASS="<password>"

Jalankan satu permintaan melalui proxy. Memberikan kredensial dengan -U menghindari masalah dengan karakter khusus dalam kata sandi.

curl -sS --max-time 20 -x "http://${SMART_HOST}:${SMART_PORT}" -U "${SMART_USER}:${SMART_PASS}" https://api.ipify.org

Responsnya harus berupa alamat IP yang bukan IP server Anda sendiri. Jika Anda melihat kesalahan 407, lompat ke tabel pemecahan masalah di akhir.

Langkah 2 — Buat proyek dan pindahkan rahasia ke file

  1. Buat direktori dan lingkungan virtual.
  2. Instal requests plus python-dotenv, yang memuat file .env ke lingkungan saat runtime.
mkdir -p ~/price-monitor && cd ~/price-monitor
python3 -m venv .venv && source .venv/bin/activate
pip install requests python-dotenv

Buat file rahasia dan kunci izinnya. File ini tidak boleh pernah di-commit.

# ~/price-monitor/.env
SMART_HOST=<host-from-dashboard>
SMART_PORT=<port-from-dashboard>
SMART_USER=<username>
SMART_PASS=<password>
chmod 600 .env
cat > .gitignore <<'EOF'
.env
.venv/
EOF

Langkah 3 — Bangun URL proxy di Python

Bangun URL sekali dan gunakan kembali. Mengutip nama pengguna dan kata sandi dengan quote() melindungi dari karakter seperti @, : atau # yang jika tidak akan merusak penguraian URL.

# ~/price-monitor/proxy_config.py
import os
from urllib.parse import quote
from dotenv import load_dotenv

load_dotenv()

def proxy_url(scheme='http'):
    user = quote(os.environ['SMART_USER'], safe='')
    password = quote(os.environ['SMART_PASS'], safe='')
    host = os.environ['SMART_HOST']
    port = os.environ['SMART_PORT']
    return f'{scheme}://{user}:{password}@{host}:{port}'

PROXIES = {'http': proxy_url(), 'https': proxy_url()}

Jika endpoint Anda menggunakan port berbeda untuk lalu lintas HTTPS, atur kedua kunci secara terpisah daripada mengasumsikan portnya sama.

Langkah 4 — Ambil halaman melalui proxy dengan percobaan ulang

Bungkus permintaan dalam loop percobaan ulang kecil. Backoff eksponensial mencegah Anda menghantam target yang membatasi laju Anda.

# ~/price-monitor/fetch_price.py
import time
import requests
from proxy_config import PROXIES

HEADERS = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/124.0 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
}

def fetch(url, retries=3, timeout=25):
    last_error = None
    for attempt in range(1, retries + 1):
        try:
            response = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=timeout)
            if response.status_code == 200:
                return response.text
            last_error = 'HTTP %s' % response.status_code
        except requests.RequestException as exc:
            last_error = str(exc)
        time.sleep(2 ** attempt)
    raise RuntimeError('Failed to fetch %s: %s' % (url, last_error))

if __name__ == '__main__':
    html = fetch('https://example.com/product/123')
    print(html[:500])

Langkah 5 — Ekstrak harga dan tambahkan ke CSV

Parser HTML seperti BeautifulSoup atau selectolax memberikan ekstraksi yang lebih tangguh, tetapi regex cukup untuk memvalidasi pipeline sebelum Anda berinvestasi pada selektor.

# ~/price-monitor/parse_price.py
import csv
import datetime
import re
import sys
from fetch_price import fetch

def parse_price(html):
    # Replace this pattern with a selector that matches the target site's markup.
    match = re.search(r'data-price=([0-9.]+)', html)
    return float(match.group(1)) if match else None

def main(url):
    price = parse_price(fetch(url))
    with open('prices.csv', 'a', newline='', encoding='utf-8') as handle:
        writer = csv.writer(handle)
        writer.writerow([datetime.datetime.now(datetime.UTC).isoformat(), url, price])

if __name__ == '__main__':
    main(sys.argv[1] if len(sys.argv) > 1 else 'https://example.com/product/123')

Langkah 6 — Tentukan bagaimana rotasi harus bekerja untuk endpoint Anda

Perilaku rotasi bergantung pada endpoint yang Anda berikan, jadi periksa dasbor Anda sebelum mengasumsikan apa pun:

  • Jika port merotasi IP keluar pada setiap permintaan, cukup memanggil fetch() lagi — setiap koneksi baru dapat keluar dari IP yang berbeda.
  • Jika port mempertahankan sesi sticky, siklus melalui port yang tercantum di dasbor Anda dan simpan satu port per worker.
  • Terus gunakan kembali requests.Session() yang sama hanya ketika Anda menginginkan sesi sticky; sesi baru per permintaan adalah default yang lebih aman untuk pemantauan.

Untuk mengonfirmasi rotasi, minta endpoint IP beberapa kali berturut-turut.

def check_ip():
    return fetch('https://api.ipify.org').strip()

if __name__ == '__main__':
    for _ in range(5):
        print(check_ip())

Langkah 7 — Tambahkan konkurensi moderat

Kumpulan thread memperpendek daftar URL yang panjang, tetapi konkurensi juga merupakan cara tercepat untuk diblokir. Mulai dari kecil dan hanya naikkan jumlah worker selama tingkat kesalahan tetap datar.

Worker bersamaan Kapan wajar
1 hingga 3 Jalankan pertama terhadap target baru
4 hingga 6 Jalankan datacenter stabil, tidak ada respons batas laju
8 atau lebih Hanya setelah pengujian, dan biasanya dengan IP residential
from concurrent.futures import ThreadPoolExecutor, as_completed
from fetch_price import fetch

urls = [f'https://example.com/product/{sku}' for sku in range(1, 6)]

with ThreadPoolExecutor(max_workers=5) as pool:
    futures = {pool.submit(fetch, url): url for url in urls}
    for future in as_completed(futures):
        url = futures[future]
        try:
            print(url, len(future.result()))
        except Exception as exc:
            print(url, 'failed:', exc)

Langkah 8 — Jadwalkan pekerjaan dengan cron

Edit crontab Anda dan tambahkan satu baris. cd penting karena skrip mengandalkan file .env-nya berada di direktori kerja.

crontab -e
0 */6 * * * cd /home/<user>/price-monitor && .venv/bin/python parse_price.py https://example.com/product/123 >> run.log 2>&1

Gunakan path absolut ke Python lingkungan virtual. python telanjang di bawah cron sering mengarah ke interpreter sistem dan tidak akan melihat paket yang Anda instal.

Menggunakan SOCKS5 Alih-alih HTTP

Smartproxy mendukung SOCKS5 bersama HTTP, dan beralih adalah perubahan satu baris. Konfirmasi port SOCKS5 di dasbor Anda, karena mungkin berbeda dari port HTTP.

pip install 'requests[socks]'
PROXIES = {'http': proxy_url('socks5'), 'https': proxy_url('socks5')}

SOCKS5 berguna ketika Anda juga ingin resolusi DNS melalui proxy, atau ketika alat lain di pipeline Anda hanya berbicara SOCKS5.

Pemecahan Masalah

Gejala Kemungkinan penyebab Yang perlu dicoba
407 Proxy Authentication Required Kredensial salah atau kedaluwarsa, atau kata sandi dengan karakter khusus yang tidak di-escape Salin ulang nilai dari dasbor, verifikasi dengan perintah curl -U dari langkah 1, dan andalkan quote() di Python
403 atau halaman CAPTCHA Target memblokir rentang datacenter, atau header terlihat otomatis Perlambat proses, kirim header browser yang realistis, dan pindahkan target itu ke kumpulan residential
429 Too Many Requests Terlalu banyak worker bersamaan Kurangi max_workers, pertahankan backoff eksponensial, dan tambahkan jeda antar batch
Connection timeout pada setiap permintaan Host atau port salah, atau lalu lintas keluar pada port itu diblokir Jalankan ulang pemeriksaan curl; tinjau ufw, iptables atau kebijakan egress korporat apa pun untuk port proxy
Berfungsi dengan pemeriksa IP tetapi gagal pada target Perlindungan anti-bot khusus untuk situs itu Uji satu permintaan di sesi browser normal, sesuaikan header, dan perkirakan beberapa target memerlukan IP residential
CERTIFICATE_VERIFY_FAILED Bundel CA di host sudah usang Perbarui ca-certificates dan paket lingkungan virtual alih-alih menonaktifkan verifikasi

Ringkasan

  • Kumpulan datacenter Smartproxy adalah default praktis untuk pemantauan harga bervolume tinggi yang hanya baca di Linux.
  • Simpan host, port, nama pengguna, dan kata sandi di file .env dengan izin 600, dan muat dengan python-dotenv.
  • Kutip kredensial sebelum memasukkannya ke URL proxy, atau karakter khusus akan merusak penguraian.
  • Selalu tetapkan timeout permintaan, coba ulang dengan backoff, dan pertahankan konkurensi rendah sampai tingkat kesalahan membuktikan aman untuk dinaikkan.
  • Periksa dasbor Anda untuk mengetahui apakah endpoint Anda berotasi per permintaan atau mempertahankan sesi sticky, lalu rancang prosesnya berdasarkan itu.
  • Pindahkan satu target yang diblokir ke kumpulan residential alih-alih membangun ulang pekerjaan, dan gunakan SOCKS5 hanya ketika Anda membutuhkannya untuk alasan DNS atau perkakas.