Beautifulsoup scraping

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dumm_will_lernen
User
Beiträge: 1
Registriert: Dienstag 8. Dezember 2020, 18:22

Hallo Ihr Lieben,

ich versuche seit Tagen eine Seite zu Kratzen und es klappt nicht. Bin verzweifelt und glaube ich bin einfach zu Dumm.

Habe diesen Code bei GitHub gefunden.

Code: Alles auswählen

import bs4
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup

my_url = 'https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38?Tpk=graphics%20card'

# opening url and grabbing the web page
uClient = urlopen(my_url)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, 'html.parser')

# grabbing all containers with class name = item-container
containers = page_soup.findAll('div', {'class':'item-container'})

filename = "products.csv"
f = open(filename, 'w')

headers = "brands, product_name, shipping\n"

f.write(headers)

container = containers[1]

for container in containers:
    brand = container.div.div.a.img['title']
    title_container = container.findAll('a', {'class':'item-title'})
    product_name = title_container[0].text
    ship_container = container.findAll('li', {'class':'price-ship'})
    # use strip() to remove blank spaces before and after text
    shipping = ship_container[0].text.strip()

    print("brand:" + brand)
    print("product_name:" + product_name)
    print("shipping:" + shipping)

    f.write(brand + ',' + product_name.replace(',' , '|') + ',' + shipping + '\n')

f.close()
Mit dem Code wollte ich die url "https://www.obi.de/search/elektrowerkzeuge/" scrapen, Titel, Artikelnummer, Preis. Egal was ich in den in Containern eingetragen habe, es hat einfach nicht funktioniert.

Kann mir hier jemand helfen ?

ich bedanke mich im voraus.
ElektroBerry
User
Beiträge: 31
Registriert: Samstag 16. Mai 2020, 18:52

Die beiden Webseiten sind verschieden.
Der größte Unterschied ist die Seitenanzahl. Die Baumarktseite hat mehrere weiterführende Seiten mit Produkten. Das zweite kleine Problem ist,
dass die Baumarktwebseite zur Seitennavigation Javascript verwendet. Also einfach ein Skript suchen und dann ein paar Variablen verändern, funktioniert hier nicht.

Code: Alles auswählen

import bs4
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
import csv

START_URL = 'https://www.obi.de/search/elektrowerkzeuge/'


def load_site(url):
    """Lädt die Url und gibt einen Html-Text zurück."""
    uClient = urlopen(url)
    page_html = uClient.read()
    uClient.close()
    return soup(page_html, 'html.parser')


# Wieviele weiterführende Seiten gibt es?
start_soup = load_site(START_URL)
site_count = start_soup.find("a", class_="pagination-bar__link-refs js-pagination-link-refs").text.split()[-1]


produkt_counter = 0
with open("products.csv", "w") as file:
    writer = csv.DictWriter(file, fieldnames=["titel", "marke", "preis"])
    writer.writeheader()
    for count in range(1, int(site_count) + 1):
        page_soup = load_site(f"https://www.obi.de/search/elektrowerkzeuge/?page={count}")
        produkte = page_soup.find_all("a", class_="product-wrapper wt_ignore")
        for product in produkte:
            produkt_counter += 1
            print(f"Gefundener Artikel Nr.{produkt_counter}:")
            titel = product.find('span', class_='description').text
            print(f"Titel: {titel}")
            marke = titel.split()[0]
            print(f"Marke: {marke}")
            preis = product.find(class_='price-new')['data-csscontent']
            print(f"Preis: {preis}\n")
            writer.writerow({"titel": titel, "marke": marke, "preis": preis})
Antworten