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.
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!
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.
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
API_KEY = "Kunci API Anda"
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!