Ich bin im Internet auf ein Skript gestoßen, mit dem Sie Produktkarten von Amazon analysieren können. Und ich brauchte einfach eine Lösung für so ein Problem.
Ich habe mir den Kopf zerbrochen, als ich nach einer Möglichkeit gesucht habe, Produktkarten von Amazon zu analysieren. Das Problem ist, dass Amazon unterschiedliche Gestaltungsmöglichkeiten für unterschiedliche Ausgaben verwendet, insbesondere – wenn Sie die Karten mit der Suchanfrage „Taschen“ analysieren müssen – werden die Karten vertikal angeordnet, wie ich es brauche, aber wenn Sie zum Beispiel nehmen , „T-Shirts“ – dann werden die Karten horizontal angeordnet, und auf diese Weise gerät das Skript in einen Fehler, es öffnet zwar die Seite, möchte aber nicht scrollen.
Außerdem habe ich das Skript aktualisiert, nachdem ich verschiedene Artikel gelesen habe, in denen Benutzer darüber rätseln, wie man Captcha bei Amazon umgehen kann, und jetzt kann es das Captcha umgehen, wenn es auftritt (es funktioniert mit 2captcha). Das Skript prüft nach jedem Laden einer neuen Seite, ob ein Captcha auf der Seite vorhanden ist, und wenn das Captcha auftritt, sendet es eine Anfrage an den 2capcha-Server, und nachdem es die Lösung erhalten hat, ersetzt es diese und arbeitet weiter.
Das Umgehen des Captchas ist jedoch nicht das schwierigste Problem, da dies heutzutage eine triviale Aufgabe ist. Die dringendere Frage ist, wie das Skript nicht nur mit der vertikalen, sondern auch mit der horizontalen Anordnung der Produktkarten funktioniert.
Im Folgenden werde ich detailliert beschreiben, was das Skript enthält, seine Funktionsweise demonstrieren und ob Sie bei der Lösung des Problems helfen können, ob Sie wissen, was Sie im Skript hinzufügen (ändern) müssen, damit es bei der horizontalen Anordnung von Karten funktioniert. Ich werde dankbar sein.
Und im Moment kann das Skript zumindest in seiner eingeschränkten Funktionalität jemandem helfen.
Also, nehmen wir das Drehbuch Stück für Stück auseinander!
Zuerst importiert das Skript die Module, die zur Erledigung der Aufgabe erforderlich sind
vom Selenium-Import-Webtreiber
aus selenium.webdriver.common.keys Schlüssel importieren
aus selenium.webdriver.common.action_chains ActionChains importieren
aus selenium.webdriver.support.ui WebDriverWait importieren
aus selenium.webdriver.support importected_conditions als EC
CSV importieren
Betriebssystem importieren
ab Zeit Schlaf importieren
Importanfragen
Lass es uns in Einzelteile zerlegen:
vom Selenium-Import-Webtreiber
Dadurch wird die Webdriver-Klasse importiert, mit der Sie den Browser (in meinem Fall Firefox) über das Skript steuern können
von selenium.webdriver.common.by import By
Dadurch wird die By-Klasse importiert, mit der das Skript nach Elementen sucht, die nach XPath analysiert werden sollen (es kann nach anderen Attributen suchen, aber in diesem Fall wird Xpath verwendet)
aus selenium.webdriver.common.keys Schlüssel importieren
Dadurch wird die Keys-Klasse importiert, die zum Simulieren von Tastenanschlägen verwendet wird. Im Fall dieses Skripts wird die Seite nach unten gescrollt, Keys.PAGE_DOWN
aus selenium.webdriver.common.action_chains ActionChains importieren
Das importiert die Klasse ActionChains, um komplexe sequentielle Aktionen zu erstellen, in unserem Fall – Klicken auf die Schaltfläche PAGE_DOWN und Warten auf das Laden aller Elemente auf der Seite (da bei Amazon Karten geladen werden, während sie gescrollt werden)
aus selenium.webdriver.support.ui WebDriverWait importieren
Dadurch wird die WebDriverWait-Klasse importiert, die wartet, bis die von uns gesuchten Informationen geladen sind, beispielsweise eine Produktbeschreibung, die wir nach Xpath durchsuchen werden
aus selenium.webdriver.support die erwarteten_Bedingungen als EC importieren
Dadurch wird die Klasse „expected_conditions“ (abgekürzt EC) importiert, die in Verbindung mit der vorherigen Klasse arbeitet und WebDriverWait mitteilt, auf welche spezifische Bedingung gewartet werden muss. Dies erhöht die Zuverlässigkeit des Skripts, sodass es nicht mit dem noch nicht geladenen Inhalt interagiert.
CSV importieren
Dadurch wird das CSV-Modul importiert, um mit CSV-Dateien zu arbeiten.
Betriebssystem importieren
Dadurch wird das Betriebssystemmodul importiert, um mit dem Betriebssystem zu arbeiten (Verzeichnisse erstellen, das Vorhandensein von Dateien prüfen usw.).
ab Zeit Schlaf importieren
Wir importieren die Sleep-Funktion – das ist die Funktion, die das Skript für eine bestimmte Zeit (in meinem Fall 2 Sekunden, aber Sie können mehr einstellen) anhält, damit die Elemente beim Scrollen geladen werden.
Anfragen importieren
Das importiert die Anforderungsbibliothek zum Senden von HTTP-Anfragen, um mit dem 2captcha-Erkennungsdienst zu interagieren.
Nachdem alles importiert wurde, beginnt das Skript mit der Konfiguration des Browsers für die Arbeit, insbesondere:
Installieren des API-Schlüssels für den Zugriff auf den 2captcha-Dienst
# API-Schlüssel für 2Captcha
API_KEY =
Das Skript enthält einen User-Agent (er kann natürlich geändert werden), der für den Browser installiert wird. Danach startet der Browser mit den angegebenen Einstellungen.
`user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/91.0.4472.124 Safari/537.36"
options = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")
driver = webdriver.Firefox(options=options)
`
Als nächstes kommt das Captcha-Lösungsmodul. Dies ist genau die Stelle, nach der Benutzer suchen, wenn sie nach der Lösung eines Captchas suchen. Wir werden diesen Code für längere Zeit nicht analysieren, da es keine besonderen Probleme damit gab.
Kurz gesagt, das Skript prüft nach jedem Laden der Seite, ob ein Captcha auf der Seite vorhanden ist, und wenn es es dort findet, löst es das Problem, indem es es an den 2captcha-Server sendet. Wenn kein Captcha vorhanden ist, wird die Ausführung einfach fortgesetzt.
`defsolve_captcha(driver):
# Überprüfen Sie, ob auf der Seite ein Captcha vorhanden ist
Versuchen Sie:
captcha_element = drivers.find_element(By.CLASS_NAME, 'g-recaptcha')
wenn captcha_element:
print("Captcha erkannt. Wird gelöst...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = drivers.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)
Parsen
Als nächstes kommt ein Abschnitt des Codes, der für das Sortieren, Laden und Scrollen der Seiten verantwortlich ist
Versuchen Sie:
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)
`
Der nächste Schritt ist die Sammlung von Produktdaten. Der wichtigste Teil. In diesem Teil untersucht das Skript die geladene Seite und übernimmt die dort angegebenen Daten. In unserem Fall sind es der Produktname, die Anzahl der Bewertungen, der Preis, die URL und die Produktbewertung.
`product_name_elements = drivers.find_elements(By.XPATH, '//span[@class="a-size-medium a-color-base a-text-normal"]')
Rating_number_elements = drivers.find_elements(By.XPATH, '//span[@class="a-size-base s-underline-text"]')
star_rating_elements = drivers.find_elements(By.XPATH, '//span[@class="a-icon-alt"]')
price_elements = drivers.find_elements(By.XPATH, '//span[@class="a-price-whole"]')
product_urls = drivers.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]
`
Als nächstes werden die angegebenen Daten in einen Ordner hochgeladen (für jede Seite wird eine CSV-Datei erstellt, die im Ausgabedateiordner gespeichert wird). Wenn der Ordner fehlt, wird er vom Skript erstellt.
` Output_directory = "Ausgabedateien"
wenn nicht 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])
`
Und die letzte Phase ist der Abschluss der Arbeiten und die Freigabe von Ressourcen.
endlich:
drivers.quit()
Das vollständige Skript
`vom Selenium-Import-Webtreiber
von selenium.webdriver.common.by import By
aus selenium.webdriver.common.keys Schlüssel importieren
aus selenium.webdriver.common.action_chains ActionChains importieren
aus selenium.webdriver.support.ui WebDriverWait importieren
aus selenium.webdriver.support importected_conditions als EC
CSV importieren
Betriebssystem importieren
ab Zeit Schlaf importieren
Importanfragen
API_KEY = „Ihr API-Schlüssel“
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/91.0.4472.124 Safari/537.36"
options = webdriver.FirefoxOptions()
options.add_argument(f"user-agent={user_agent}")
driver = webdriver.Firefox(options=options)
defsolve_captcha(driver):
# Überprüfen Sie, ob auf der Seite ein Captcha vorhanden ist
Versuchen Sie:
captcha_element = drivers.find_element(By.CLASS_NAME, 'g-recaptcha')
wenn captcha_element:
print("Captcha erkannt. Wird gelöst...")
site_key = captcha_element.get_attribute('data-sitekey')
current_url = drivers.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)
versuchen Sie:
# Startseiten-URL
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])
endlich:
drivers.quit()
`
Auf diese Weise funktioniert das Skript fehlerfrei, jedoch nur für vertikale Produktkarten. Hier ist ein Beispiel dafür, wie das Skript funktioniert.
Ich werde es gerne in den Kommentaren besprechen, wenn Sie etwas dazu zu sagen haben.
Das obige ist der detaillierte Inhalt vonAmazon-Parsing auf einfachem Niveau und ganz alleine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!