2017-10-22 2 views
0

Ich habe ein Problem mit dem Versuch, einige Daten von verschiedenen Seiten zu verwerfen. Ich habe versucht, einige Lösungen googeln, aber überhaupt nicht funktioniert.Web Scraping nächste Seite

Mein Punkt Web-Schrott ist nur die Namen der Grafikkarten von dieser Website: „https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page=2&PageSize=12&order=BESTMATCH

In erster Linie habe ich versucht, einen Code zu bauen, die nur mit einer der Seiten funktioniert. Und das funktioniert ziemlich gut.

#

from urllib2 import urlopen as uReq 
    from bs4 import BeautifulSoup as soup 
    import requests 
    import re 

    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page=2&PageSize=12&order=BESTMATCH" 
    uClient = uReq(my_url) 
    page_html = uClient.read() 
    uClient.close() 
    page_soup = soup(page_html, "html.parser") 

    containers = page_soup.findAll("div",{"class":"item-container"}) 
    container = containers[0] 

    for container in containers: 
     title_container = container.findAll("a",{"class":"item-title"}) 
     product_name = title_container[0].text 
     print("product_name: " + product_name) 
#

Damit habe ich die Namen der Grafikkarte auf der Seite 2. Wenn ich es auf 1 am HTML umschalten kann ich die Namen der ersten bekommen als Gut.

#

Ich habe versucht, eine Schleife zu machen, aber es scheint nur die erste Seite immer und immer wieder zurückzukehren.

#

i = 1 
    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&bop=And&Depa=1&Category=38&Page={}&PageSize=12&order=BESTMATCH".format(i) 
    while i <= 3: 
     uClient = uReq(my_url) 
     page_html = uClient.read() 
     uClient.close() 
     page_soup = soup(page_html, "html.parser") 

     # esse é o que vou usar para fazer o loop 

     containers = page_soup.findAll("div",{"class":"item-container"}) 

     container = containers[0] 


     for container in containers: 
      title_container = container.findAll("a",{"class":"item-title"}) 
      product_name = title_container[0].text 

      print("product_name: " + product_name) 

     i = i+1 

#

Hat mir jemand kann dabei helfen? = D

PS: Sei frei, meinen Code zu ändern und eine bessere Lösung vorzuschlagen, Leute. PS 2: Python 3.5 bei Jupyter Lab.

Antwort

0

Sie müssen eine Schleife so erstellen, dass die Verbindung, die Sie in Ihrem Scraper bereitstellen, fehlerfrei verläuft. Sie können dasselbe auf verschiedene Arten erreichen. Hier ist einer von ihnen. Führen Sie einfach das Skript aus, und Sie erhalten alle Produktnamen auf drei Seiten.

import requests 
from bs4 import BeautifulSoup 

for page in range(1,4): 
    my_url = "https://www.newegg.com/Product/ProductList.aspx?Submit=StoreIM&IsNodeId=1&page={}&bop=And&Depa=1&Category=38&PageSize=12&order=BESTMATCH".format(page) 
    res = requests.get(my_url).text 
    soup = BeautifulSoup(res, "lxml") 
    for container in soup.select(".item-title"): 
     print("product_name: {}".format(container.text)) 
+0

Hey, @Shahin. Vielen Dank für Ihre Hilfe. Ja, es hat perfekt funktioniert! Ich kenne nicht alle Pakete, die Sie mir vorgeschlagen haben (lxml), also habe ich versucht, Google zu verstehen, um Ihren Code zu verstehen. Aber über meinen Code, könnten Sie mir erklären, was schief gelaufen ist? Ich kann nicht verstehen, warum es die erste Seite immer und immer wieder kratzte. Ich habe eine Schleife gewechselt, oder? BTW: Entschuldigung für Sie warten. Ich habe deinen Post gesehen, aber ich war bei der Arbeit und ich habe Python nicht dort, um es zu versuchen. = D –

+0

Kommentar gelöscht. Vielen Dank. – SIM

+0

Ich verbesserte den Code, um nach weiteren Details zu suchen: Ist das der bessere Weg? (Ich habe versucht, zwei Schleifen mit "for" zu machen ... es ist furchtbar, ohne Bildung zu zeigen) ------- für Container in supp.select (". Item-title"): drucken (" product_name: {} ". format (container.text)) für shipping_container in supp.select (". price-ship "): drucken (" shipping_const: {} ". format (shipping_container.text)) –