Вся необходимая информация содержится в json
объектах в исходном коде каждой страницы, к счастью, javascript
не требуется для их извлечения, поэтому вам не нужно selenium
, что медленный по своей природе, и вы можете просто использовать requests
для извлечения объекта json
и преобразования его в объект python
, то есть:
x = requests.get("https://cars.com")
if x.status_code == 200:
js_obj = re.findall("REDUX_STATE = (.*?)</script>", x.text, re.IGNORECASE | re.MULTILINE)
if js_obj:
j_obj = json.loads(js_obj[0]) # check the tree view of the object on notes
Объект json на главной странице cars.com содержит все марки и модели, которые представлены идентификаторами, а именно:
mkId
= идентификационный номер mdId
= идентификационный номер модели
С помощью этой информации мы можем создавать поисковые запросы для всех марок и моделей:
https://www.cars.com/for-sale/searchresults.action/?dealerType=all&mdId=20773&mkId=20001&page=1&perPage=100
cars.com.py
import requests, re, json
x = requests.get("https://cars.com")
if x.status_code == 200:
js_obj = re.findall("REDUX_STATE = (.*?)</script>", x.text, re.IGNORECASE | re.MULTILINE)
if js_obj:
j_obj = json.loads(js_obj[0])
for model in j_obj['home']['makeModels']['models'][:1]: # remove [:1] to parse all makes and models
mkId = model['makeId']
mdId = model['id']
label = model['label']
name = model['name']
#print(mkId, mdId, label, name)
# 20001 20773 CL CL
s_url = f"https://www.cars.com/for-sale/searchresults.action/?dealerType=all&mdId={mdId}&mkId={mkId}&page=1&perPage=100"
s_page = requests.get(s_url)
if s_page.status_code == 200:
s_html = re.findall(r"CARS\.digitalData = (.*?);\s+</script>", s_page.text, re.IGNORECASE | re.MULTILINE)
if s_html:
s_obj = json.loads(s_html[0])
if "page" in s_obj:
if "vehicle" in s_obj['page']:
for v in s_obj["page"]['vehicle']:
v_price = v['price']
v_make = v['make']
v_mileage = v['mileage']
#...
print(v_make, name, v_price, v_mileage)
Вывод: (v_make, name, v_price, v_m Пробег)
Acura CL 8800 43000
Acura CL 3999 116577
Acura CL 6995 62382
Acura CL 6987 63871
Acura CL 6777 136676
Acura CL 1995 172911
Acura CL 2995 170234
Acura CL 3989 240799
Acura CL 1999 124000
Acura CL 4998 39322
Acura CL 3175 105200
Acura CL 6995 129558
Acura CL 4000 153000
Acura CL 2295 147056
Acura CL 4800 156000
Acura CL 3995 170558
Acura CL 1500 197000
Acura CL 1750 177392
Acura CL 1750 133094
Acura CL 3999 140618
Acura CL 2500 175600
Acura CL 1100 240000
Acura CL 5950 115055
Acura CL 1995 93419
Acura CL None 167456
Acura CL 5900 93500
Acura CL 3444 193000
Acura CL 3900 161756
Acura CL None 125231
Acura CL 3150 202201
Acura CL 5998 130017
Acura CL 5000 158955
Acura CL 3288 0
Acura CL 3300 153713
Acura CL None 202147
Примечания:
- Python DEMO
- Скрипт нуждается в улучшении для отлова ошибок