Ich habe den folgenden Code geschrieben, um die Cargurus-Website zu scrappen. Eine Suche zeigt 15 Einträge pro Seite.So gehen Sie durch die Seiten beim Web-Scraping
Ich möchte iterativ von Seite 1 nach n bewegen und jede Seite abkratzen. Der folgende Code soll das tun, aber am Ende des Skripts habe ich einen Dataframe df, der die erste Seite numPages mal dupliziert.
Ich dachte, der Code gab dem Computer keine Zeit, die Anfrage zu empfangen, also fügte ich eine time.sleep (1) Zeile hinzu, aber das scheint nicht zu funktionieren.
Was mache ich falsch?
# Import Modules
from bs4 import BeautifulSoup as bs
import requests
import pandas as pd
import seaborn as sns
import time
#Utility Functions
def to_number(s):
#Convert to Number
numval = int(s.replace(',',''))
return numval
def get_location(s):
#Convert to City, State (SS), and zip (string)
s = s.replace(',','')
sList = s.split()
n = len(sList)-1
City = ''
for word in sList[0:n-1]:
City += word + ' '
City = City[:-1]
State = sList[n-1]
Zip = sList[n]
return City, State, Zip
def get_YearMakeModelTrim(s):
#Convert to Year, Make, Model, Trim
sList = s.split()
n = len(sList)-1
Year = sList[0]
Make = sList[1]
Model = sList[2]
if n == 3:
Trim = sList[3]
else:
Trim = "None"
return Year, Make, Model, Trim
numPages = 10
baseURL = 'https://www.cargurus.com/Cars/inventorylisting/viewDetailsFilterViewInventoryListing.action?sourceContext=forSaleTab_false_0&newSearchFromOverviewPage=true&inventorySearchWidgetType=AUTO&entitySelectingHelper.selectedEntity=c24578&entitySelectingHelper.selectedEntity2=c25202&zip=03062&distance=50000&searchChanged=true&modelChanged=false&filtersModified=true#resultsPage={}'
data = []
for ii in range(numPages):
URL = baseURL.format(ii+1)
print(URL)
r = requests.get(URL).text
time.sleep(1)
soup = bs(r,'html.parser')
stats = soup.find_all("div", attrs = {"class": "cg-dealFinder-result-stats"})
deals = soup.find_all("div", attrs = {"class": "cg-dealFinder-result-deal"})
titles = soup.find_all("h4", {"class":"cg-dealFinder-result-model"})
for title, deal, stat in zip(titles,deals,stats):
row = {}
row["Price"] = to_number(stat.find('span').get_text()[1:])
row["Mileage"] = to_number(stat.find_all("p")[1].text[9:])
row["City"], row["State"], row["Zip"] = get_location(stat.find_all("p")[2].text[10:])
row["natAvgPrice"] = to_number(deal.find('span', attrs = {'class': 'nationalAvg'}).get_text()[17:])
row["Year"], row["Make"], row["Model"], row["Trim"] = get_YearMakeModelTrim(title.find('span', attrs = {'itemprop': 'name'}).get_text())
row["NewUsed"] = title.find('span', attrs = {'class': 'invisibleLayer'}).get_text()[:-5]
data.append(row)
df = pd.DataFrame(data)
#df = df.drop_duplicates()
sns.pairplot(x_vars=["Mileage"], y_vars=["Price"], data=df, hue="Trim", size=5)
Verwendung 'print()' URL und Daten anzuzeigen von Seite - vielleicht liest du immer die selbe Seite. – furas
Ich denke, ich lese die gleiche Seite. Das ist der Punkt dieser Frage. Warum geht es jetzt auf die nächste Seite? Ich habe die URL ausgedruckt. Es ist im Code. Die URL ändert sich mit jeder Iteration der Schleife. Hier ist die Ausgabe (verkürzt). Für die 1. 3 zur Veranschaulichung. https: /// www.cargurus.com/Cars/i ... = true # ergebnisseSeite = 1 https: /// www.cargurus.com/Cars/i ... = true # ergebnisseSeite = 2 https: /// www.cargurus.com/Cars/i ... = true # resultsPage = 3 – DeeeeRoy
für mich verwendet es Javascript, um Daten zu ersetzen - Ereignis, wenn Sie verschiedene URLs verwenden, erhalten Sie die gleichen Daten, da 'Anfragen' +' beautifulsoup' kann 'JavaScript' nicht ausführen. Möglicherweise müssen Sie 'Selenium' verwenden, um den Webbrowser zu steuern, der die Seite liest und javaScript ausführt. – furas