Mengapa Scrapy Membutuhkan Proxy
Proxy untuk Scrapy memungkinkan alat ini terhubung melalui alamat IP yang berbeda, alih-alih selalu menggunakan alamat IP mesin yang menjalankannya. Hal ini berguna untuk tugas-tugas berbasis lokasi, pengujian, pemantauan, dan pekerjaan lain di mana sumber koneksi menjadi faktor penting.
Scrapy tetap menangani tugas utamanya. Proksi yang menangani asal koneksi tersebut.
Apa yang terjadi tanpa proxy: pemblokiran IP, batasan laju, dan pembatasan geografis
Tanpa proxy, situs web akan terus mendeteksi alamat IP yang sama. Seiring meningkatnya aktivitas, alamat IP tersebut mungkin akan mencapai batas laju atau diblokir.
Lokasi juga bisa menjadi faktor penting. Halaman yang dibuka dari Jerman mungkin tidak menampilkan konten yang sama dengan yang dibuka dari AS.
Proxy untuk Scrapy memungkinkan Anda terhubung dari berbagai alamat IP dan lokasi sesuai kebutuhan.
Jenis proxy apa yang sebaiknya digunakan dengan Scrapy
Jenis proxy yang tepat bergantung pada jenis tugasnya.
| Jenis proxy | Pengambilan data | Pengelolaan akun | Pengujian | Pemantauan |
|---|
| Residential | Cocok jika lokasi dan sumber IP menjadi pertimbangan | Berguna jika akun memerlukan IP residential | Cocok untuk pengujian berbasis lokasi | Berguna untuk memeriksa konten dari berbagai lokasi |
| ISP | Cocok saat diperlukan IP yang stabil | Berguna untuk sesi yang lebih lama pada satu IP | Cocok untuk pengujian dengan IP yang konsisten | Berguna untuk pemeriksaan berkelanjutan dari IP yang sama |
| Pusat Data | Cocok untuk kecepatan dan volume permintaan yang lebih besar | Lebih baik saat IP residensial tidak diperlukan | Cocok untuk pengujian umum | Cocok untuk pemeriksaan otomatis yang sering |
Proksi perumahan berguna ketika sumber IP dan lokasi menjadi faktor penting. Proksi ISP berfungsi dengan baik ketika alamat IP yang sama perlu tetap aktif dalam jangka waktu yang lebih lama. Proksi pusat data cocok digunakan ketika fokus utamanya adalah kecepatan dan skala.
Pilihan terbaik juga bergantung pada apakah tugas tersebut memerlukan penargetan geografis, koneksi yang stabil, atau akses ke kumpulan alamat IP yang lebih besar.
Cara menghubungkan proxy di Scrapy
Pengaturan proxy Scrapy memerlukan host, port, nama pengguna, dan kata sandi Geonode. Simpan kredensial tersebut dalam variabel lingkungan, lalu muat saat mengatur proxy dalam kode.
Menggunakan Geonode? Dapatkan nama pengguna dan kata sandi dari Kredensial Akses serta host, port, dan protokol dari Informasi Server Proxy.
Jalur pengaturan atau kode
Untuk pengujian kami, kami menambahkan middleware pengunduh:
DOWNLOADER_MIDDLEWARES = {
"geonode_scrapy.middlewares.GeonodeProxyMiddleware": 350,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
Middleware tersebut meneruskan URL proxy melalui request.meta["proxy"]
, yang kemudian digunakan oleh HttpProxyMiddleware
dari Scrapy:
request.meta["proxy"] = proxy_url
Anda juga dapat meneruskan proxy secara langsung ke permintaan individu:
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Simpan nama pengguna dan kata sandi yang sebenarnya dalam variabel lingkungan, bukan menuliskannya langsung di berkas Python. Pengaturan ini berhasil mengembalikan status HTTP 200 melalui proxy selama pengujian kami.
Format otentikasi host:port:user:pass
Geonode
memberikan empat nilai:
proxy.geonode.io:PORT:USERNAME:PASSWORD
Scrapy memerlukan detail yang sama seperti URL proxy:
http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Simpan kredensial atau nilai proxy lengkap dalam variabel lingkungan:
GEONODE_PROXY_URL=http://USERNAME:PASSWORD@proxy.geonode.io:PORT
Kemudian muat di Python:
import os
proxy_url = os.environ["GEONODE_PROXY_URL"]
Untuk pengujian HTTP kami, format yang dihasilkan adalah:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
Untuk memeriksa otentikasi, kami juga menjalankan permintaan dengan kredensial yang salah. Scrapy menerima kode status HTTP 407 dengan respons:
Authentication error. Please check your authentication settings.
Scrapy menampilkan respons tersebut melalui HttpErrorMiddleware
sebagai HttpError('Ignoring non-200 response')
.
Rotasi vs. sesi tetap di Scrapy
Jika permintaan tidak perlu menggunakan alamat IP yang sama, gunakan rotasi.
Untuk pengujian kami, kami memberikan proxy rotasi Geonode
kepada Scrapy:
proxy_url = "http://USERNAME:PASSWORD@proxy.geonode.io:9000"
yield scrapy.Request(
url,
meta={"proxy": proxy_url},
)
Kami membuat lima permintaan berturut-turut:
Request 1: 101.98.231.191
Request 2: 101.98.231.191
Request 3: 101.98.231.191
Request 4: 122.164.83.189
Request 5: 122.164.83.189
Unique IPs: 2
Rotation: Yes
Pengujian ini membuktikan bahwa rotasi terjadi, tetapi alamat IP tidak berubah pada setiap permintaan.
Jika permintaan yang terkait perlu tetap menggunakan alamat IP yang sama, gunakan sesi tetap (sticky session) sebagai gantinya:
proxy_url = (
"http://USERNAME-session-blogtest01-lifetime-10:"
"PASSWORD@proxy.geonode.io:10000"
)
Kami melakukan tiga permintaan menggunakan sesi yang sama:
Request 1: 177.73.202.78
Request 2: 177.73.202.78
Request 3: 177.73.202.78
Same IP: Yes
Ketiga permintaan tersebut menggunakan alamat IP yang sama dalam pengujian kami.
Lihat panduan Geonode
untuk proksi rotasi dan sesi tetap guna mengetahui pengaturan yang tersedia.
Kesalahan proxy yang umum terjadi di Scrapy dan cara mengatasinya
Jika proxy tidak berfungsi, mulailah dengan memeriksa detail koneksi. Periksa nama pengguna dan kata sandi, lalu alamat host, port, dan protokol. Pesan kesalahan yang ditampilkan oleh Scrapy biasanya dapat membantu mengidentifikasi sumber masalah.
407 Diperlukan Otentikasi Proksi
Kode status 407 biasanya menandakan adanya masalah otentikasi.
Saat kami menguji Scrapy dengan kredensial yang salah, proxy mengembalikan pesan:
HTTP status: 407
Authentication error. Please check your authentication settings.
Periksa nama pengguna dan kata sandi terlebih dahulu. Jika keduanya benar, pastikan Scrapy menerima URL proxy lengkap beserta skema, kredensial, host, dan port.
ERR_TUNNEL_CONNECTION_FAILED / koneksi ditolak
Kesalahan koneksi biasanya berarti Scrapy tidak dapat terhubung ke proxy.
Periksa terlebih dahulu alamat host dan portnya. Kemudian, pastikan protokolnya sesuai dengan server proxy yang digunakan.
Scrapy tidak selalu mengembalikan respons ERR_TUNNEL_CONNECTION_FAILED seperti pada browser. Dalam uji koneksi yang gagal ini, Scrapy mencoba kembali permintaan tersebut dan akhirnya mengembalikan DownloadFailedError yang berisi pesan kesalahan Twisted ConnectionLost.
Timeout dan respons kosong
Timeout berarti permintaan tidak menerima respons dalam waktu yang telah ditentukan.
Pertama, periksa apakah URL tujuan berfungsi dan apakah proxy dapat terhubung. Jika keduanya berfungsi, periksa konfigurasi timeout di Scrapy.
Untuk pengujian kegagalan koneksi kami, kami menggunakan port proxy yang tidak valid dengan DOWNLOAD_TIMEOUT=5
. Setelah beberapa kali percobaan ulang, Scrapy mengembalikan:
DownloadFailedError(
ConnectionLost:
Connection to the other side was lost in a non-clean fashion.
)
Jadi, koneksi proxy yang gagal mungkin muncul sebagai kesalahan koneksi, bukan sekadar pesan timeout.
Satu Kesalahan Khusus pada Scrapy
Salah satu kesalahan umum yang sering terjadi pada Scrapy adalah mengirimkan nilai yang tidak lengkap ke request.meta["proxy"]
.
Dalam pengujian kami, kami menggunakan:
proxy.geonode.io:9000
tanpa skema atau kredensial. Permintaan tersebut mengembalikan kode status HTTP 407.
Solusinya adalah dengan mengirimkan URL proxy yang lengkap:
http://USERNAME:PASSWORD@proxy.geonode.io:9000
atau membiarkan middleware pengunduh menyusunnya dari variabel lingkungan.
Scrapy + Geonode: apa yang Anda dapatkan
Scrapy menangani permintaan atau koneksi dalam aplikasi. Geonode menangani koneksi proxy.
Anda dapat memilih proxy residential, ISP, atau datacenter sesuai dengan kebutuhan pekerjaan, lalu menggunakan rotasi, sesi tetap, dan penargetan geografis jika diperlukan. Hal ini memastikan pengaturan proxy tetap terpisah dari kode aplikasi lainnya.
Paket bervariasi tergantung jenis proxy, dengan beberapa opsi dihitung berdasarkan harga per GB.
Pertanyaan yang Sering Diajukan
Apakah Scrapy mendukung proxy SOCKS5?
SOCKS5 memerlukan pengaturan tambahan pada versi Scrapy yang kami uji.
Upaya menggunakan proxy socks5:// melalui handler HTTP bawaan Scrapy gagal dengan pesan:
UnsupportedURLSchemeError("Unsupported scheme: b'socks5'")
Kami kemudian menginstal httpx2[socks] dan mengonfigurasi HttpxDownloadHandler eksperimental Scrapy. Dengan proxy bergilir SOCKS5 pada port 11000, permintaan berhasil dengan status HTTP 200 dan mengembalikan alamat IP proxy. Penanganan ini masih dalam tahap eksperimental, sehingga lebih cocok untuk pengujian daripada sebagai rekomendasi untuk produksi.
Apakah saya bisa mengganti alamat IP per permintaan di Scrapy?
Ya, Scrapy dapat mengirimkan permintaan melalui proxy bergilir, tetapi tidak dijamin bahwa setiap permintaan akan menggunakan alamat IP yang berbeda.
Pengujian lima permintaan kami menghasilkan dua alamat IP yang unik. Tiga permintaan pertama menggunakan satu alamat IP yang sama, sedangkan dua permintaan terakhir menggunakan alamat IP yang berbeda, yang menegaskan bahwa rotasi memang terjadi selama pengujian.
Apakah ada uji coba gratis?
Ya. Geonode menawarkan uji coba gratis, sehingga proxy tersebut dapat diuji dengan Scrapy sebelum beralih ke paket berbayar. Lihat uji coba gratis dan paket yang tersedia saat ini.
Di mana saya harus mengonfigurasi proxy di Scrapy?
Untuk permintaan tunggal, tentukan proxy melalui request.meta["proxy"].
Jika pengaturan proxy yang sama diperlukan untuk banyak permintaan, middleware downloader akan mengelola logika proxy di satu tempat. Dalam pengujian kami, middleware khusus tersebut menetapkan request.meta["proxy"] sebelum middleware bawaan Scrapy, HttpProxyMiddleware, memproses permintaan tersebut.
Mengapa spider Scrapy saya berjalan tetapi tidak mengirimkan permintaan apa pun?
Periksa bagaimana spider tersebut membuat permintaan pertamanya.
Dalam pengujian Scrapy 2.19 kami, mendefinisikan hanya metode lama ``start_requests()`
menyebabkan spider terbuka dan tertutup tanpa mengirimkan permintaan apa pun. Menggunakan metode asinkron ``start()
` memperbaiki masalah tersebut:
async def start(self):
yield scrapy.Request(...)
Inilah perilaku yang tercatat selama pengujian kami.