#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) Вы могли бы попробовать прокручивать, пока не будут видны все, и выполнить ручной подсчет для подтверждения.