Beranda BlogPengikisan web Cara menggunakan proxy dengan permintaan Python

Cara menggunakan proxy dengan permintaan Python

oleh Kadek

Cara merotasi proxy dengan Asyc dan Aiohttp

Menggunakan aiohttp untuk rotasi proxy asinkron meningkatkan efisiensi operasi pengikisan web dan memungkinkan beberapa permintaan diproses secara bersamaan.

Kami memodifikasi contoh sebelumnya fetch_url() berfungsi untuk digunakan
aiohttp untuk rotasi proxy asinkron. Hal ini memungkinkan beberapa permintaan diproses secara bersamaan, yang sangat penting untuk tugas pengumpulan data besar yang memerlukan kinerja tinggi dan menghindari deteksi.


  import aiohttp
  import asyncio
  
  async def fetch_url(url, proxies):
      # Select an active proxy from the list each time the function is called
      proxy = find_active_proxy(proxies)
      proxy_url = f'http://{proxy}'
      print(f'Using proxy: {proxy}')
  
      # Create an HTTP client session
      async with aiohttp.ClientSession() as session:
          # Send a GET request to the URL using the selected proxy
          async with session.get(url, proxy=proxy_url) as response:
              print(f'Status: {response.status}')
              print(await response.text())  

Sekarang mari kita lakukan itu main() Fitur untuk mengelola banyak URL:


  async def main(proxies):
  urls_to_scrape = (
      'http://httpbin.org/get' # List the URLs you want to scrape here.
  )
  for url in urls_to_scrape:
      await fetch_url(url, proxies)

Terakhir, Anda perlu menginisialisasi dan menjalankan fungsi utama:


  proxies = fetch_proxies() 
  asyncio.run(main(proxies))

Menggunakan aiohttp untuk rotasi proksi asinkron memastikan bahwa tugas pengikisan web kami lebih efisien, yang mempercepat proses ekstraksi data dan secara signifikan meningkatkan kemampuan untuk mengelola tugas pengikisan skala besar.

Cara merotasi proxy dengan Selenium

Menggunakan Selenium untuk merotasi proksi sangat ideal untuk tugas pengikisan web yang memerlukan interaksi dengan situs web yang banyak menggunakan JavaScript atau mensimulasikan perilaku pengguna.

Kami mengubahnya fetch_url() Fungsi dari contoh kami sebelumnya dan gunakan perpustakaan Selenium untuk mencapai hal ini.


  import selenium
  from selenium import webdriver
  
  def fetch_url(url, proxies):
      # Select an active proxy
      proxy = find_active_proxy(proxies)
      print(f"Using proxy: {proxy}")
      
      # Set up proxy for Selenium
      options = webdriver.ChromeOptions()
      options.add_argument(f'--proxy-server={proxy}')
  
      # Initialize Chrome driver with proxy
      driver = webdriver.Chrome(options=options)
      try:
          # Load the URL
          driver.get(url)
      except Exception as e:
          print(f"Failed to fetch URL: {str(e)}")
      finally:
          driver.quit()
  
  # Load your initial list of proxies
  proxies = fetch_proxies()
  
  # URLs to scrape
  urls_to_scrape = ("https://example.com/")
  
  # Scrape each URL with a rotated proxy using Selenium
  for url in urls_to_scrape:
      fetch_url(url, proxies)

Di modifikasi fetch_url() Fungsi: Kami menggunakan WebDriver Selenium untuk berinteraksi dengan browser Chrome. Kami mengonfigurasi WebDriver untuk menggunakan proxy yang dipilih untuk setiap permintaan, memungkinkan kami merutekan lalu lintas melalui alamat IP yang berbeda.

Dengan menggabungkan Selenium dengan rotasi proksi, kami dapat melakukan tugas pengikisan web tingkat lanjut dengan lebih efektif sambil menjaga keandalan dan anonimitas selama proses berlangsung.

Rotasi proxy dengan ScraperAPI

Sekarang kita telah mempelajari cara merotasi proxy pada tingkat dasar, jelas bahwa menerapkan metode ini untuk memproses kumpulan data besar akan jauh lebih rumit. Menggunakan alat seperti ScraperAPI adalah pilihan cerdas untuk cara yang lebih mudah dan andal dalam mengelola proxy yang berputar.

Inilah sebabnya ScraperAPI dapat mengubah manajemen proxy Anda:

  • Sederhanakan alur kerja Anda: ScraperAPI menangani tugas berat dalam mengelola dan merotasi proxy sehingga Anda dapat fokus pada hal yang paling penting – data Anda.
  • Rotasi proksi cerdas: ScraperAPI menggunakan rotasi cerdas berdasarkan pembelajaran mesin dan analisis statistik untuk merotasi proxy secara cerdas dan memastikan Anda selalu memiliki koneksi terbaik untuk kebutuhan Anda.
  • Pertahankan integritas proxy: Anda tidak perlu khawatir tentang mempertahankan proxy Anda. ScraperAPI secara otomatis menghapus proxy yang tidak berfungsi, sehingga kumpulan Anda selalu terbarui.
  • Siap untuk menskalakan: Berapapun ukuran proyek Anda, ScraperAPI beradaptasi dengan kebutuhan Anda, yang sempurna untuk proyek yang sedang berkembang.

Saat Anda memilih ScraperAPI, Anda menghindari kerumitan manajemen proksi manual dan mendapatkan alat yang mudah dan efisien yang memungkinkan Anda fokus pada ekstraksi dan penggunaan data Anda secara efektif.

Coba lagi permintaan yang gagal

Terkadang kami menerima permintaan yang gagal karena masalah jaringan atau masalah tak terduga lainnya. Di bagian ini, kita akan mempelajari tiga metode utama untuk mencoba kembali permintaan yang gagal dengan permintaan Python:

  • Menggunakan pembungkus berulang yang sudah ada: Metode ini sangat cocok untuk solusi cepat dan mudah. Ia menggunakan alat yang sudah tersedia di Python untuk menangani percobaan ulang, sehingga menghemat waktu dan tenaga Anda.
  • Mengkodekan pembungkus coba ulang Anda sendiri: Jika Anda memerlukan sesuatu yang lebih disesuaikan dengan kebutuhan spesifik Anda, Anda dapat menggunakan metode ini untuk membuat sistem pengulangan Anda sendiri dari awal.

Namun, sebelum memutuskan tindakan terbaik, kami perlu memahami mengapa permintaan kami gagal.

Penyebab umum kesalahan permintaan

Memahami masalah umum yang dapat menyebabkan permintaan HTTP gagal akan membantu Anda lebih mempersiapkan dan menerapkan strategi percobaan ulang yang efektif.

Berikut tiga penyebab utama kesalahan permintaan:

Masalah jaringan

Masalah jaringan adalah salah satu alasan paling umum kegagalan permintaan HTTP. Hal ini dapat berkisar dari gangguan sementara pada koneksi internet Anda hingga pemadaman jaringan besar yang mempengaruhi wilayah yang lebih luas. Jika jaringan tidak stabil, permintaan Anda mungkin habis waktu atau hilang dalam perjalanan, sehingga mengakibatkan kegagalan upaya mengambil atau mengirim data.

Server kelebihan beban

Penyebab umum lainnya dari permintaan yang gagal adalah kelebihan beban server. Jika server yang Anda coba komunikasikan menerima lebih banyak permintaan daripada yang dapat ditangani, server tersebut mungkin akan memutuskan koneksi masuk atau membutuhkan waktu lebih lama untuk merespons. Penundaan ini dapat mengakibatkan waktu tunggu dimana permintaan Anda tidak diproses dalam jangka waktu yang diharapkan, sehingga mengakibatkan kesalahan.

Pembatasan tarif

Pembatasan tarif adalah mekanisme kontrol yang digunakan API untuk membatasi jumlah permintaan yang dapat dibuat pengguna dalam jangka waktu tertentu. Jika Anda mengirimkan terlalu banyak permintaan terlalu cepat, server mungkin memblokir permintaan tambahan Anda untuk jangka waktu tertentu. Ini adalah tindakan perlindungan untuk mencegah kelebihan beban server dan memastikan penggunaan wajar oleh semua pengguna.

Penting bagi Anda untuk memahami batas kapasitas API yang Anda gunakan, karena melebihi batas ini sering kali mengakibatkan permintaan gagal.

Dengan mengidentifikasi dan memahami masalah umum ini, Anda dapat menyesuaikan logika percobaan ulang dengan skenario kesalahan tertentu dengan lebih baik, sehingga meningkatkan keandalan permintaan HTTP Anda.

Diagnosis permintaan Anda yang gagal

Setelah Anda memahami penyebab paling umum dari kesalahan permintaan, langkah selanjutnya adalah mempelajari cara mendiagnosis masalah ini ketika terjadi. Untuk melakukan ini, Anda perlu mengidentifikasi masalah dan memilih strategi yang tepat untuk menyelesaikannya.

Identifikasi masalahnya

Salah satu cara termudah untuk mengetahui mengapa permintaan gagal adalah dengan melihat kode status HTTP yang dikembalikan. Kode-kode ini adalah respons standar yang memberi tahu Anda apakah permintaan berhasil dan, jika tidak, apa yang salah. Misalnya:

  • kesalahan 5xx menunjukkan masalah sisi server.
  • kesalahan 4xx menunjukkan masalah pada permintaan tersebut, seperti akses tidak sah atau permintaan sumber daya yang tidak ada.
  • Batas waktu sering kali tidak disertai dengan kode status, namun penting untuk diidentifikasi karena menunjukkan potensi masalah dengan kelebihan beban jaringan atau server.

Berikut adalah beberapa kode status paling umum yang dapat terjadi selama web scraping dan menunjukkan berbagai jenis kesalahan:

200 oke

Permintaan itu berhasil. Kode status ini menunjukkan bahwa operasi berhasil diterima, dipahami, dan diterima.

404 tidak ditemukan

Sumber daya yang diminta tidak dapat ditemukan di server. Hal ini sering terjadi ketika website target telah dipindahkan atau dihapus. Namun, ini juga bisa berarti scraper Anda telah diblokir.

500 Internal Server Error

Pesan kesalahan umum ketika terjadi kondisi tak terduga di server.

502 Bad Gateway

Server menerima respons yang tidak valid dari server upstream yang diaksesnya saat mencoba memenuhi permintaan.

503 Layanan tidak tersedia

Karena kelebihan beban sementara atau pemeliharaan terjadwal, server saat ini tidak dapat memproses permintaan.

429 Terlalu banyak permintaan

Kode status ini sangat penting bagi web scraper karena ini menunjukkan bahwa Anda telah mencapai batas kecepatan server.

Kode status ini menunjukkan apa yang salah dan memungkinkan Anda menyesuaikan strategi permintaan Anda.

Alat dan teknik

Untuk mendiagnosis masalah jaringan dan server lebih lanjut, Anda dapat mempertimbangkan untuk menggunakan alat berikut:

  • Alat diagnostik jaringan: Alat seperti Wireshark atau Ping dapat membantu Anda mengetahui apakah permintaan Anda dipengaruhi oleh masalah konektivitas jaringan.
  • klien HTTP: Alat seperti Postman atau curl memungkinkan Anda mengirim permintaan secara manual dan memeriksa respons mendetail dari server, termasuk header yang mungkin berisi kolom "Coba Lagi-Setelah" jika terjadi pembatasan kecepatan.
  • Pencatatan: Pastikan skrip pengikisan Anda mencatat cukup detail tentang permintaan yang gagal. Ini mungkin termasuk waktu permintaan, URL yang diminta, kode status yang diterima, dan pesan respons server apa pun. Informasi ini sangat penting untuk mendiagnosis masalah yang membandel dan meningkatkan ketahanan skrip Anda.

Dengan menggunakan alat dan teknik diagnostik ini secara efektif, Anda dapat dengan cepat mengidentifikasi penyebab permintaan yang gagal. Hal ini memudahkan Anda menerapkan solusi yang tepat untuk menjaga efisiensi dan efektivitas tugas web scraping Anda.

Solusi untuk kesalahan permintaan umum

Ada dua cara untuk mencoba kembali permintaan Python:

  1. Gunakan pembungkus coba ulang yang ada seperti Sesi Python dengan HTTPAdapter.
  2. Kodekan pembungkus coba ulang Anda sendiri.

Opsi pertama adalah yang terbaik dalam banyak kasus karena mudah dan efektif. Namun, jika Anda memerlukan sesuatu yang lebih spesifik, opsi kedua mungkin lebih baik.

Logika percobaan ulang diterapkan menggunakan pembungkus percobaan ulang yang sudah ada

Solusi praktis untuk menangani percobaan ulang dengan Python
Permintaan Perpustakaan adalah dengan menggunakan pembungkus coba lagi yang sudah ada, seperti
Adaptor HTTPPendekatan ini menyederhanakan pengaturan mekanisme percobaan ulang dan membuat permintaan HTTP Anda tidak terlalu rentan terhadap kesalahan.

Langkah 1: Impor modul yang diperlukan

Sebelum Anda mulai, pastikan itu requests Dan
urllib3 Perpustakaan dipasang di lingkungan Anda. Jika tidak, Anda dapat menginstalnya dengan pip:


  pip install requests urllib3

Kemudian impor modul yang diperlukan ke dalam skrip Python Anda:


  import requests
  from requests.adapters import HTTPAdapter
  from urllib3.util.retry import Retry

Langkah 2: Buat instance HTTPAdapter dengan parameter coba lagi

Buat instance HTTPAdapter dan konfigurasikan dengan strategi coba lagi. Kelas Coba Ulang menyediakan beberapa opsi untuk menyesuaikan cara penanganan percobaan ulang:


  retry_strategy = Retry(
    total=3,  # Total number of retries to allow. This limits the number of consecutive failures before giving up.
    status_forcelist=(429, 500, 502, 503, 504),  # A set of HTTP status codes we should force a retry on.
    backoff_factor=2  # This determines the delay between retry attempts
)

adapter = HTTPAdapter(max_retries=retry_strategy)

Penyiapan ini memerintahkan adaptor untuk mencoba ulang hingga tiga kali jika permintaan HTTP gagal dengan salah satu kode status yang ditentukan. Itu
backoff_factor menimbulkan penundaan antar percobaan ulang, yang berguna saat server kelebihan beban atau down untuk sementara.

Setiap percobaan ulang menunggu hal berikut:
{backoff factor} * (2 ^ {number of total retries - 1}) detik.

Langkah 3: Sertakan HTTPAdapter dalam sesi Permintaan

Setelah menentukan strategi percobaan ulang, lampirkan HTTPAdapter
requests.Session(). Hal ini memastikan bahwa semua permintaan yang dikirim melalui sesi ini mengikuti aturan percobaan ulang yang Anda tetapkan:


  session = requests.Session()
  session.mount("http://", adapter)
  session.mount("https://", adapter)

Dengan menyertakan adaptor dalam sesi tersebut, logika percobaan ulang diterapkan ke semua jenis permintaan HTTP dan HTTPS yang dibuat dari sesi tersebut.

Contoh penggunaan

Sekarang gunakan sesi untuk mengirim permintaan. Untuk melakukan permintaan GET menggunakan sesi yang Anda konfigurasi:


  url = 'http://example.com'
  response = session.get(url)
  print(response.status_code)
  print(response.text)

Objek sesi ini secara otomatis menangani percobaan ulang sesuai dengan pengaturan yang Anda tentukan. Jika terjadi kesalahan seperti tidak tersedianya server atau respons yang membatasi kecepatan, permintaan tersebut dapat dicoba ulang hingga tiga kali, sehingga meningkatkan keandalan interaksi jaringan Anda.

Pos terkait

Tinggalkan Komentar