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.
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
- Buat direktori dan lingkungan virtual.
- Instal
requestspluspython-dotenv, yang memuat file.envke 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
.envdengan izin600, dan muat denganpython-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.