Seite 1 von 1

Beautifulsoup scraping

Verfasst: Dienstag 8. Dezember 2020, 18:56
von Dumm_will_lernen
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.

Re: Beautifulsoup scraping

Verfasst: Dienstag 8. Dezember 2020, 22:49
von ElektroBerry
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})