извлечение всех ссылок car с динамической страницы

#python #web-scraping

#python #очистка веб-страниц

Вопрос:

 from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'")
#options.add_argument("headless")
driver=webdriver.Chrome(executable_path="/home/timmy/Python/chromedriver",chrome_options=options)

url="https://turo.com/search?country=USamp;defaultZoomLevel=7amp;endDate=03/20/2019amp;endTime=10:00amp;international=trueamp;isMapSearch=falseamp;itemsPerPage=200amp;location=Colorado, USAamp;locationType=Cityamp;maximumDistanceInMiles=30amp;northEastLatitude=41.0034439amp;northEastLongitude=-102.040878amp;region=COamp;sortType=RELEVANCEamp;southWestLatitude=36.992424amp;southWestLongitude=-109.060256amp;startDate=03/15/2019amp;startTime=10:00"
driver.get(url)


list_of_all_car_links=[]
x=0
while True:
    html=driver.page_source
    soup = BeautifulSoup(html, "html.parser")
    for i in soup.find_all("a", href=True):
        if i['href'].startswith("/rentals") and len(i['href']) > 31 :
            link2="https://turo.com" i['href']
            list_of_all_car_links.append(link2)
    try:
        x=scrolldown(last_height=x)
    except KeyError:
        #driver.close()
        break
  

я попытался выполнить прокрутку вниз, а затем найти ссылки, но я получил только часть, вот моя функция прокрутки вниз:

 def scrolldown(last_height=0,SCROLL_PAUSE_TIME=3,num_tries = 2):

        # Scroll down to bottom
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

        # Wait to load page
    time.sleep(SCROLL_PAUSE_TIME)

    new_height = driver.execute_script("return document.body.scrollHeight")

        # break condition
    if last_height == new_height:
        #print("hello")
        num_tries-=1
        if num_tries==0:
            print("Reached End of page")
            raise KeyError
        else:
            scrolldown(last_height=last_height, SCROLL_PAUSE_TIME=2,num_tries=num_tries)

    return new_height
  

Я также пытался конвертировать html после каждой прокрутки, чтобы BeautifulSoup затем найти ссылки, но не получил все ссылки.

я хочу получить все ссылки на автомобили на этой странице.

Комментарии:

1. Вы проверяли URL запроса, начинающийся с https://turo.com/api/search . Он содержит все, что вы хотите (по крайней мере, 200 элементов). И я нашел URL-адрес транспортного средства в этом.

Ответ №1:

Я бы использовал requests и API, показанный в списке xhr в инструментах разработки. Обратите внимание на параметр items per page в строке запроса itemsPerPage=200 . Вы можете попробовать изменить это для больших наборов результатов.

 import requests
url = 'https://turo.com/api/search?country=USamp;defaultZoomLevel=7amp;endDate=03/20/2019amp;endTime=10:00amp;international=trueamp;isMapSearch=falseamp;itemsPerPage=200amp;location=Colorado, USAamp;locationType=Cityamp;maximumDistanceInMiles=30amp;northEastLatitude=41.0034439amp;northEastLongitude=-102.040878amp;region=COamp;sortType=RELEVANCEamp;southWestLatitude=36.992424amp;southWestLongitude=-109.060256amp;startDate=03/15/2019amp;startTime=10:00'
baseUrl = 'https://turo.com'
headers = {'Referer' : 'https://turo.com/search?country=USamp;defaultZoomLevel=7amp;endDate=03/20/2019amp;endTime=10:00amp;international=trueamp;isMapSearch=falseamp;itemsPerPage=200amp;location=Colorado, USAamp;locationType=Cityamp;maximumDistanceInMiles=30amp;northEastLatitude=41.0034439amp;northEastLongitude=-102.040878amp;region=COamp;sortType=RELEVANCEamp;southWestLatitude=36.992424amp;southWestLongitude=-109.060256amp;startDate=03/15/2019amp;startTime=10:00',
           'User-Agent' : 'Mozilla/5.0'}

r = requests.get(url, headers = headers).json()
results = []

for item in r['list']:
    results.append(baseUrl   item['vehicle']['url'])
print(results)
  

Комментарии:

1. спасибо, это дает ровно 200 ссылок, как я могу быть уверен, что это весь список?

2. в URL-адресе itemsPerPage=200 можно изменить аргумент items per page для каждой страницы

3. даже если я изменю длину, она все равно будет 200

4. Я подозреваю, что это максимум на страницу. Доступно ли более 200 ссылок на странице при проверке? Возможно ли передать параметр разбивки на страницы в URL? например, страница = 1

5. В настоящее время вы получаете результаты на самой странице только для того, что находится в порту просмотра (например, используя селекторы css) Вы могли бы попробовать прокручивать, пока не будут видны все, и выполнить ручной подсчет для подтверждения.