나는 아래의 코드를 작성하여 cargurus 웹 사이트를 긁었다. 검색은 페이지 당 15 개의 항목을 보여줍니다.웹 스크 레이 핑을 할 때 페이지를 넘기는 방법
페이지 1에서 n으로 반복적으로 이동하여 각 페이지를 긁어 내고 싶습니다. 아래 코드는 그렇게하기로되어 있지만, 스크립트의 끝에서 첫 번째 페이지 numPages 시간을 복제하는 데이터 프레임 df가 있습니다.
나는 time.sleep (1) 라인을 추가했지만 코드가 컴퓨터에 요청을 수신 할 시간이 없다고 생각했지만 작동하지 않는 것 같습니다.
내가 뭘 잘못하고 있니?
# 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)
사용'인쇄()'만 처음 10 개 항목을 표시 페이지에서 - 항상 같은 페이지를 읽을 수 있습니다. – furas
나는 같은 페이지를 읽고 있다고 생각한다. 그것이이 질문의 핵심입니다. 왜 이제 다음 페이지로 이동합니까? 나는 URL을 출력했다. 그것은 코드에 있습니다. 루프 반복마다 URL이 변경됩니다. 다음은 결과입니다 (줄임). 그림의 첫 번째 3. https : /// www.cargurus.com/Cars/i ... = true # resultsPage = 1 https : /// www.cargurus.com/Cars/i ... = true # resultsPage = 2 https : /// www.cargurus.com/Cars/i ... = true # resultsPage = 3 – DeeeeRoy
나를 위해 javascript를 사용하여 데이터 이벤트를 대체합니다. 다른 URL을 사용하면 동일한 데이터를 얻을 수 있습니다. 왜냐하면'requests' +'' beautifulsoup'는'JavaScript'를 실행할 수 없습니다. 'Selenium'을 사용하여 페이지를 읽고 javaScript를 실행할 웹 브라우저를 제어해야 할 수도 있습니다. – furas