Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penghuraian Amazon pada tahap yang mudah dan semuanya sendiri

Penghuraian Amazon pada tahap yang mudah dan semuanya sendiri

PHPz
PHPzasal
2024-08-31 06:04:331153semak imbas

Saya terjumpa skrip di Internet yang membolehkan anda menghuraikan kad produk daripada Amazon. Dan saya hanya perlukan penyelesaian untuk masalah seperti itu.

Saya memerah otak sambil mencari cara untuk menghuraikan kad produk dari Amazon. Masalahnya ialah Amazon menggunakan pilihan reka bentuk yang berbeza untuk output yang berbeza, khususnya – jika anda perlu menghuraikan kad dengan pertanyaan carian "beg" - kad akan disusun secara menegak, seperti yang saya perlukan, tetapi jika anda mengambil, sebagai contoh , "t-shirt" – kemudian kad akan disusun secara mendatar, dan dengan cara sedemikian skrip jatuh ke dalam ralat, ia berjaya membuka halaman, tetapi tidak mahu menatal.

Amazon parsing on easy level and all by yourself

Selain itu, selepas membaca pelbagai artikel di mana pengguna tertanya-tanya tentang cara memintas captcha di Amazon, saya menaik taraf skrip dan kini ia boleh memintas captcha jika ia berlaku (ia berfungsi dengan 2captcha). Skrip menyemak kehadiran captcha pada halaman selepas setiap memuatkan halaman baharu, dan jika captcha berlaku, ia menghantar permintaan kepada pelayan 2capcha, dan selepas menerima penyelesaian, menggantikannya dan terus berfungsi.

Namun, cara memintas captcha bukanlah masalah yang paling sukar, kerana ini adalah tugas yang remeh pada masa kini. Soalan yang lebih mendesak ialah bagaimana membuat skrip berfungsi bukan sahaja dengan susunan menegak kad produk, tetapi juga dengan kad mendatar.

Di bawah saya akan menerangkan secara terperinci perkara yang disertakan dalam skrip, menunjukkan kerjanya dan jika anda boleh membantu menyelesaikan masalah itu, jika anda tahu perkara yang perlu ditambah (ubah) dalam skrip supaya ia berfungsi pada persediaan mendatar kad, Saya akan berterima kasih.

Dan buat masa ini skrip boleh membantu seseorang sekurang-kurangnya dalam fungsi terhadnya.

Jadi, mari kita pisahkan skrip sekeping demi sekeping!

Persediaan

Pertama, skrip mengimport modul yang diperlukan untuk menyelesaikan tugas

daripada pemacu web import selenium
daripada selenium.webdriver.common.keys import Keys
daripada selenium.webdriver.common.action_chains import ActionChains
daripada selenium.webdriver.support.ui import WebDriverWait
daripada selenium.webdriver.support import expected_conditions sebagai EC
import csv
import os
dari masa import tidur
permintaan import

Mari kita pisahkan beberapa bahagian:

daripada pemacu web import selenium

Itu mengimport kelas pemacu web, yang membolehkan anda mengawal penyemak imbas (dalam kes saya Firefox) melalui skrip

daripada selenium.webdriver.common.by import Oleh

Itu mengimport kelasBy, yang dengannya skrip akan mencari elemen untuk dihuraikan oleh XPath (ia boleh mencari atribut lain, tetapi dalam kes ini Xpath akan digunakan)

daripada selenium.webdriver.common.keys import Keys

Itu mengimport kelas Keys, yang akan digunakan untuk mensimulasikan ketukan kekunci, dalam kes skrip ini, ia akan menatal halaman ke bawah Keys.PAGE_DOWN

daripada selenium.webdriver.common.action_chains import ActionChains

Itu mengimport kelasActionChains untuk mencipta tindakan berurutan yang kompleks, dalam kes kami – mengklik pada butang PAGE_DOWN dan menunggu semua elemen pada halaman dimuatkan (kerana pada kad Amazon dimuatkan semasa ia ditatal)

daripada selenium.webdriver.support.ui import WebDriverWait

Itu mengimport kelas WebDriverWait, yang menunggu sehingga maklumat yang kami cari dimuatkan, sebagai contoh, penerangan produk, yang akan kami cari melalui Xpath

daripada selenium.webdriver.support import expected_conditions sebagai EC

Itu mengimport kelas expected_conditions (disingkat EC) yang berfungsi bersama dengan kelas sebelumnya dan memberitahu WebDriverWait syarat khusus yang perlu ditunggu. Itu meningkatkan kebolehpercayaan skrip supaya ia tidak mula berinteraksi dengan kandungan yang belum dimuatkan.

import csv

Itu mengimport modul csv untuk berfungsi dengan fail csv.

os import

Itu mengimport modul os untuk berfungsi dengan sistem pengendalian (membuat direktori, menyemak kehadiran fail, dll.).

dari masa import tidur

Kami mengimport fungsi tidur – ini ialah fungsi yang akan menjeda skrip untuk masa tertentu (dalam kes saya, 2 saat, tetapi anda boleh menetapkan lebih banyak) supaya elemen akan dimuatkan semasa menatal.

permintaan import

Itu mengimport perpustakaan permintaan untuk menghantar permintaan HTTP, untuk berinteraksi dengan perkhidmatan pengecaman 2captcha.

Konfigurasi

Selepas semuanya diimport, skrip mula mengkonfigurasi penyemak imbas untuk berfungsi, khususnya:

Memasang kunci API untuk mengakses perkhidmatan 2captcha

# kunci API untuk 2Captcha
API_KEY =

Skrip mengandungi ejen pengguna (tentu saja ia boleh diubah), yang dipasang untuk penyemak imbas. Selepas itu, penyemak imbas bermula dengan tetapan yang ditentukan.

`user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, seperti Gecko) Chrome/91.0.4472.124 Safari/537.36"

pilihan = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")

pemandu = webdriver.Firefox(options=options)
`

Seterusnya modul penyelesaian captcha. Inilah tempat yang dicari oleh pengguna apabila mereka mencari cara menyelesaikan captcha. Kami tidak akan menganalisis sekeping kod ini untuk masa yang lama, kerana tiada masalah tertentu dengannya.

Ringkasnya, skrip, selepas setiap halaman dimuatkan, menyemak kehadiran captcha pada halaman dan jika ia menemuinya di sana, menyelesaikannya dengan menghantarnya ke pelayan 2captcha. Jika tiada captcha, ia hanya meneruskan pelaksanaan lebih jauh.

`def solve_captcha(pemandu):
# Semak kehadiran captcha pada halaman
cuba:
captcha_element = driver.find_element(Oleh.CLASS_NAME, 'g-recaptcha')
jika captcha_element:
print("Captcha dikesan. Menyelesaikan...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = driver.current_url

        # Send captcha request to 2Captcha
        captcha_id = requests.post(
            'http://2captcha.com/in.php', 
            data={
                'key': API_KEY, 
                'method': 'userrecaptcha', 
                'googlekey': site_key, 
                'pageurl': current_url
            }
        ).text.split('|')[1]

        # Wait for the captcha to be solved
        recaptcha_answer = ''
        while True:
            sleep(5)
            response = requests.get(f"http://2captcha.com/res.php?key={API_KEY}&action=get&id={captcha_id}")
            if response.text == 'CAPCHA_NOT_READY':
                continue
            if 'OK|' in response.text:
                recaptcha_answer = response.text.split('|')[1]
                break

        # Inject the captcha answer into the page
        driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML = "{recaptcha_answer}";')
        driver.find_element(By.ID, 'submit').click()
        sleep(5)
        print("Captcha solved.")
except Exception as e:
    print("No captcha found or error occurred:", e)


Menghuraikan
Seterusnya terdapat bahagian kod yang bertanggungjawab untuk mengisih halaman, memuatkan dan menatalnya

cuba:
base_url = "https://www.amazon.in/s?k=bags"

for page_number in range(1, 10): 
    page_url = f"{base_url}&page={page_number}"

    driver.get(page_url)
    driver.implicitly_wait(10)

    solve_captcha(driver)

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]')))

    for _ in range(5):  
        ActionChains(driver).send_keys(Keys.PAGE_DOWN).perform()
        sleep(2)

`

Sekeping seterusnya ialah pengumpulan data produk. Bahagian yang paling penting. Dalam bahagian ini, skrip memeriksa halaman yang dimuatkan dan mengambil data yang ditentukan dari sana. Dalam kes kami ini ialah nama produk, bilangan ulasan, harga, URL, rating produk.

`elemen_nama_produk = pemacu.cari_elemen(Oleh.XPATH, '//span[@class="saiz-sederhana-warna-asas-teks-biasa"]')
rating_number_elements = driver.find_elements(By.XPATH, '//span[@class="a-size-base s-underline-text"]')
star_rating_elements = driver.find_elements(Oleh.XPATH, '//span[@class="a-icon-alt"]')
price_elements = driver.find_elements(Oleh.XPATH, '//span[@class="a-price-whole"]')
product_urls = driver.find_elements(By.XPATH, '//a[@class="a-link-normal s-underline-text s-underline-link-text s-link-style a-text-normal"]')

    product_names = [element.text for element in product_name_elements]
    rating_numbers = [element.text for element in rating_number_elements]
    star_ratings = [element.get_attribute('innerHTML') for element in star_rating_elements]
    prices = [element.text for element in price_elements]
    urls = [element.get_attribute('href') for element in product_urls]

`

Seterusnya, data yang ditentukan dimuat naik ke folder (fail csv dibuat untuk setiap halaman, yang disimpan ke folder fail output). Jika folder itu tiada, skrip menciptanya.

` output_directory = "fail output"
jika bukan os.path.exists(output_directory):
os.makedirs(output_directory)

    with open(os.path.join(output_directory, f'product_details_page_{page_number}.csv'), 'w', newline='', encoding='utf-8') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['Product Urls', 'Product Name', 'Product Price', 'Rating', 'Number of Reviews'])
        for url, name, price, star_rating, num_ratings in zip(urls, product_names, prices, star_ratings, rating_numbers):
            csv_writer.writerow([url, name, price, star_rating, num_ratings])

`

Dan peringkat terakhir ialah penyiapan kerja dan pelepasan sumber.

akhirnya:
pemandu.berhenti()

Skrip penuh

`daripada pemacu web import selenium
daripada selenium.webdriver.common.by import Oleh
daripada selenium.webdriver.common.keys import Keys
daripada selenium.webdriver.common.action_chains import ActionChains
daripada selenium.webdriver.support.ui import WebDriverWait
daripada selenium.webdriver.support import expected_conditions sebagai EC
import csv
import os
dari masa import tidur
permintaan import

Kunci API untuk 2Captcha

API_KEY = "Kunci API Anda"

Tetapkan ejen pengguna tersuai untuk meniru penyemak imbas sebenar

user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, seperti Gecko) Chrome/91.0.4472.124 Safari/537.36"

pilihan = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")

pemandu = webdriver.Firefox(options=options)

def solve_captcha(pemandu):
# Semak kehadiran captcha pada halaman
cuba:
captcha_element = driver.find_element(Oleh.CLASS_NAME, 'g-recaptcha')
jika captcha_element:
print("Captcha dikesan. Menyelesaikan...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = driver.current_url

        # Send captcha request to 2Captcha
        captcha_id = requests.post(
            'http://2captcha.com/in.php', 
            data={
                'key': API_KEY, 
                'method': 'userrecaptcha', 
                'googlekey': site_key, 
                'pageurl': current_url
            }
        ).text.split('|')[1]

        # Wait for the captcha to be solved
        recaptcha_answer = ''
        while True:
            sleep(5)
            response = requests.get(f"http://2captcha.com/res.php?key={API_KEY}&action=get&id={captcha_id}")
            if response.text == 'CAPCHA_NOT_READY':
                continue
            if 'OK|' in response.text:
                recaptcha_answer = response.text.split('|')[1]
                break

        # Inject the captcha answer into the page
        driver.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML = "{recaptcha_answer}";')
        driver.find_element(By.ID, 'submit').click()
        sleep(5)
        print("Captcha solved.")
except Exception as e:
    print("No captcha found or error occurred:", e)

cuba:
# URL halaman permulaan
base_url = "https://www.amazon.in/s?k=bags"

for page_number in range(1, 2): 
    page_url = f"{base_url}&page={page_number}"

    driver.get(page_url)
    driver.implicitly_wait(10)

    # Attempt to solve captcha if detected
    solve_captcha(driver)

    # Explicit Wait
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]')))

    for _ in range(5):  
        ActionChains(driver).send_keys(Keys.PAGE_DOWN).perform()
        sleep(2)

    product_name_elements = driver.find_elements(By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]')
    rating_number_elements = driver.find_elements(By.XPATH, '//span[@class="a-size-base s-underline-text"]')
    star_rating_elements = driver.find_elements(By.XPATH, '//span[@class="a-icon-alt"]')
    price_elements = driver.find_elements(By.XPATH, '//span[@class="a-price-whole"]')
    product_urls = driver.find_elements(By.XPATH, '//a[@class="a-link-normal s-underline-text s-underline-link-text s-link-style a-text-normal"]')

    # Extract and print the text content of each product name, number of ratings, and star rating, urls
    product_names = [element.text for element in product_name_elements]
    rating_numbers = [element.text for element in rating_number_elements]
    star_ratings = [element.get_attribute('innerHTML') for element in star_rating_elements]
    prices = [element.text for element in price_elements]
    urls = [element.get_attribute('href') for element in product_urls]

    sleep(5)        
    output_directory = "output files"
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)

    with open(os.path.join(output_directory, f'product_details_page_{page_number}.csv'), 'w', newline='', encoding='utf-8') as csvfile:
        csv_writer = csv.writer(csvfile)
        csv_writer.writerow(['Product Urls', 'Product Name', 'Product Price', 'Rating', 'Number of Reviews'])
        for url, name, price, star_rating, num_ratings in zip(urls, product_names, prices, star_ratings, rating_numbers):
            csv_writer.writerow([url, name, price, star_rating, num_ratings])

akhirnya:
pemandu.berhenti()

`

Dengan cara ini skrip berfungsi tanpa ralat, tetapi hanya untuk kad produk menegak. Berikut ialah contoh cara skrip berfungsi.

Saya berbesar hati untuk membincangkannya dalam ulasan jika anda mempunyai sesuatu untuk diperkatakan tentangnya.

Atas ialah kandungan terperinci Penghuraian Amazon pada tahap yang mudah dan semuanya sendiri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Seni Bina SeleniumArtikel seterusnya:Seni Bina Selenium