Я написал простой веб-скребок, который использует файл Excel с кодами ean для поиска продуктов на сайте и получения их цены. У меня есть одна большая проблема, когда я открываю первую станцию браузера, где я принимаю файлы cookie и настраиваю локализацию магазина, который я хочу удалить.
driver.get("https://www.castorama.pl")
driver.switch_to.frame(driver.find_element(By.CLASS_NAME, "truste_popframe"))
time.sleep(1)
accept = driver.find_element(By.CLASS_NAME, "call").click()
driver.switch_to.default_content()
postcode = driver.find_element(By.CLASS_NAME, "_1a41e483").send_keys("38-500")
time.sleep(1)
submit_postcode = driver.find_element(By.XPATH, "//span[normalize-space()='Dodaj']").click()
results = []
это работает нормально, но проблема начинается, когда я хочу использовать функцию с циклом для поиска, а затем эта локализация не установлена, и ее нужно каждый раз устанавливать снова
def getdata(symbol):
driver.get(f"https://www.castorama.pl/search?term = {symbol}")
name = WebDriverWait(driver,2).until(
EC.presence_of_element_located((By.ID, "product-title"))
)
price = WebDriverWait(driver,2).until(
EC.presence_of_element_located((By.CLASS_NAME, "_5d34bd7a"))
)
records = {
'ean': symbol,
'cena': price.text,
'name': name.text
}
return records
У вас есть идеи, как это решить?






Вместо selenium вы можете использовать их API разбиения на страницы, чтобы получить результаты напрямую в форме Json:
import requests
params = {
"include": "content",
"page[number]": "1",
"page[size]": "24",
"searchTerm": "farba", # <-- the search term
"storeId": 1543 # <-- add store id here
}
headers = {
'Authorization': 'Atmosphere atmosphere_app_id=kingfisher-EPgbIZbIpBzipu0bKltAFm1xler30LKmaF4vJH96'
}
api_url = 'https://api.kingfisher.com/v2/mobile/products/CAPL'
for params['page[number]'] in range(1, 2): # <-- increase number of pages here
data = requests.get(api_url, params=params, headers=headers).json()
for r in data['data']:
a = r['attributes']
print(f'{a["pricing"]["currentUnitPrice"]["amountIncTax"]:>8} {a["pricing"]["currencyCode"]:<4} {a["name"]}')
Отпечатки:
30.79 PLN Farba Dulux EasyCare jasny spokój 2,5 l
7.25 PLN Farba Dekoral Ściany i Sufity 10 l + 20% gratis
29.4 PLN Farba Dulux EasyCare idealne cappuccino 5 l
4.7 PLN Farba biała mat 10 l
20.0 PLN Farba Dulux Ściany i Sufity najpopularniejszy szary 5 l
25.99 PLN Farba Dekoral Voice of Color miętowy pastelowy 2,5 l
11.8 PLN Farba Dulux Premium White 10 l
29.4 PLN Farba Dulux EasyCare designerski szary 5 l
37.99 PLN Farba Dulux EasyCare Kuchnia i Łazienka biały 2,5 l
37.99 PLN Farba Dulux EasyCare Kuchnia karmelowe latte 2,5 l
14.8 PLN Farba lateksowa Tikkurila Super White 10 l
37.99 PLN Farba Dulux EasyCare Kuchnia i Łazienka złoty pieprz 2,5 l
...and so on.
Обновлено: Для поиска по коду:
import requests
# store_id=1593 - warsaw
# sorte_id=1543 - wroclaw
store_id = 1543
product_id = '5908305642893'
params = {"searchTerm": f"{product_id}_CAPL", "storeId": store_id}
api_url = "https://api.kingfisher.com/v2/mobile/products/CAPL"
headers = {
"Authorization": "Atmosphere atmosphere_app_id=kingfisher-EPgbIZbIpBzipu0bKltAFm1xler30LKmaF4vJH96"
}
data = requests.get(api_url, params=params, headers=headers).json()
a = data["data"][0]["attributes"]
print(
f'{a["pricing"]["currentUnitPrice"]["amountIncTax"]:>8} {a["pricing"]["currencyCode"]:<4} {a["name"]}'
)
Отпечатки:
0.3 PLN Ziemia uniwersalna 50 l
@ŁukaszTarnowski Вы можете добавить параметр storeId к своему запросу. Вы можете найти storeId, если откроете Инструменты веб-разработчика -> вкладка «Сеть» и измените магазин (должны быть запросы, содержащие этот идентификатор)
У меня плохо с API. Недавно начал изучать питон. Есть ли возможность сделать это с селеном?
хорошо. Я почти понял. Но что, если я хочу искать не по фразе типа «фарба», а по коду ean типа «5908305642893», и, например, у меня есть 100 кодов в файле xls или csv, и я хочу проверить их все.
@ ŁukaszTarnowski Я обновил свой ответ.
Спасибо, добавлена функция и циклы для поиска каждой строки штрих-кода в файле excel. Но я только прошу подсказку, как сохранить результат в файле excel. В предыдущей программе такого типа я использовал pandas, но у меня пока нет опыта работы с JSON.
import requests
import pandas as pd
df = pd.read_excel('eanCS.xlsx', dtype = "int64")
mylist = df['ean'].tolist()
store_id = 2793
product_id = mylist
def getdata(symbol):
params = {"searchTerm": f"{symbol}_CAPL", "storeId": store_id}
data = requests.get(api_url, params=params, headers=headers).json()
a = data["data"][0]["attributes"]
print(f'{a["pricing"]["currentPrice"]["amountIncTax"]:>4} {a["pricing"]
["currencyCode"]:<4} {a["ean"]:<4} {a["name"]:<4} ')
api_url = "https://api.kingfisher.com/v2/mobile/products/CAPL"
headers = {
"Authorization": "Atmosphere atmosphere_app_id=kingfisher-
EPgbIZbIpBzipu0bKltAFm1xler30LKmaF4vJH96"
}
for item in mylist:
getdata(item)
Вы можете сохранить цену, ean, имя, ... в список, создать новый фрейм данных и использовать DataFrame.to_csv или DataFrame.to_excel для его сохранения.
Большое спасибо за вашу помощь. У меня последний вопрос. Я хочу добавить наличие продукта. Вы можете помочь мне. Я ищу атрибуты InStore, но это не работает.
спасибо, но в разных городах цена разная и мне нужно выбрать локализацию. Могу ли я сделать это с помощью этого API?