Heim > Backend-Entwicklung > Python-Tutorial > Amazon-Parsing auf einfachem Niveau und ganz alleine

Amazon-Parsing auf einfachem Niveau und ganz alleine

PHPz
Freigeben: 2024-08-31 06:04:33
Original
1177 Leute haben es durchsucht

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.

Amazon parsing on easy level and all by yourself

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!

Vorbereitung

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.

Konfiguration

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)
Nach dem Login kopieren
Nach dem Login kopieren


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)
Nach dem Login kopieren

`

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]
Nach dem Login kopieren

`

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])
Nach dem Login kopieren

`

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-Schlüssel für 2Captcha

API_KEY = „Ihr API-Schlüssel“

Richten Sie einen benutzerdefinierten Benutzeragenten ein, um einen echten Browser nachzuahmen

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)
Nach dem Login kopieren
Nach dem Login kopieren

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])
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage