Веб-скребок Python Selenium

Я написал простой веб-скребок, который использует файл 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

У вас есть идеи, как это решить?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо 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

спасибо, но в разных городах цена разная и мне нужно выбрать локализацию. Могу ли я сделать это с помощью этого API?

Łukasz Tarnowski 26.06.2023 22:34

@ŁukaszTarnowski Вы можете добавить параметр storeId к своему запросу. Вы можете найти storeId, если откроете Инструменты веб-разработчика -> вкладка «Сеть» и измените магазин (должны быть запросы, содержащие этот идентификатор)

Andrej Kesely 26.06.2023 22:39

У меня плохо с API. Недавно начал изучать питон. Есть ли возможность сделать это с селеном?

Łukasz Tarnowski 26.06.2023 23:05

хорошо. Я почти понял. Но что, если я хочу искать не по фразе типа «фарба», а по коду ean типа «5908305642893», и, например, у меня есть 100 кодов в файле xls или csv, и я хочу проверить их все.

Łukasz Tarnowski 27.06.2023 00:16

@ ŁukaszTarnowski Я обновил свой ответ.

Andrej Kesely 27.06.2023 00:33

Спасибо, добавлена ​​функция и циклы для поиска каждой строки штрих-кода в файле 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 для его сохранения.

Andrej Kesely 27.06.2023 12:11

Большое спасибо за вашу помощь. У меня последний вопрос. Я хочу добавить наличие продукта. Вы можете помочь мне. Я ищу атрибуты InStore, но это не работает.

Łukasz Tarnowski 27.06.2023 15:56

Другие вопросы по теме