Как получить все результаты с помощью BeautifulSoup с селеном и отключить автоматическую тестовую страницу?

Я пытаюсь просмотреть веб-сайт в Интернете, он показывает только 24 результата, как мне загрузить все результаты со скрытой автоматической тестовой страницей?

Под кодом:

    # import library
    from selenium import webdriver
    from selenium.webdriver import Chrome
    import pandas as pd
    import bs4


    #create list
    items = []
    prices = []
    volumes = []


    driver = webdriver.Chrome()
    driver.get("https://www.fairprice.com.sg/category/milk-powder")
    soup = bs4.BeautifulSoup(driver.page_source, 'lxml')
    allelem = soup.find_all('div',class_='sc-1plwklf-0 iknXK product-container')

    #read all element
    for item in allelem:
      items.append(item.find('span', class_='sc-1bsd7ul-1 eJoyLL').text.strip())
  
    #read price
    for price in allelem:
      prices.append(price.find('span', class_='sc-1bsd7ul-1 sc-1svix5t-1 gJhHzP biBzHY').text.strip())


    #read volume
    for volume in allelem:
      volumes.append(volume.find('span', class_='sc-1bsd7ul-1 eeyOqy').text.strip())

    print(items)
    print(volumes)
    print(prices)

    #create dataframe
    final_array = []
    for item,price,volume in zip(items,prices,volumes):
     final_array.append({'Item':item,'Volume':volume,'Price':price})
    
    # covert to excel
    df = pd.DataFrame(final_array)
    print(df)
    df.to_excel('ntucv4milk.xlsx',index=False)

Конец кода

Прокрутите окно просмотра вниз, пока не перестанете получать обновления, а затем передайте материал в BS. Если вам нужно найти более подробную информацию в Google, вы ищете, как справиться с ленивой загрузкой с помощью селена.

rasjani 13.02.2023 09:30

Привет @ Rasjani, я пытался использовать Google для этого, но почему-то не могу найти способ решить эту проблему, а также скрыть автоматическую тестовую страницу.

jjbkd 13.02.2023 09:34

Возможно, вам придется ввести некоторое псевдослучайное время ожидания между каждым действием, чтобы вас не считали ботом, или заплатить за помощь с капчей (веб-сайты, которые решают капчи, используют людей и имеют API). Капчу нелегко обойти, но на этом же форуме есть несколько тем с некоторыми предложениями. Никто не знает надежного способа обойти капчу.

dot 13.02.2023 12:21

Я думаю, проблема в том, что сайт загрузил только новый элемент, когда прокрутка вниз загрузит новый элемент. Я до сих пор не нашел, как сделать его автоматически прокручиваемым

jjbkd 14.02.2023 10:31
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
1
4
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Мое предложение состоит в том, чтобы определить три списка (элементы, цены, объемы), которые будут постепенно увеличиваться при прокрутке страницы вниз. Если у вас есть список elements веб-элементов, вы можете легко перейти к последнему, запустив

driver.execute_script('arguments[0].scrollIntoView({block: "center", behavior: "smooth"});', elements[-1])

Затем все, что вам нужно сделать, это дождаться загрузки новых элементов, а затем добавить их в три списка. Если за заданное время (max_wait, что составляет 10 секунд) не загружено ни одного элемента, то, вероятно, элементов для загрузки больше нет, и мы можем разорвать цикл.

import time
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

chromedriver_path = '...'
driver = webdriver.Chrome(service=Service(chromedriver_path))

driver.get('https://www.fairprice.com.sg/category/milk-powder')

items, prices, volumes = [], [], []
c = 0 # counter
max_wait = 10
no_new_items = False

while 1:
    items_new = driver.find_elements(By.CSS_SELECTOR, 'div[data-testid = "product-name-and-metadata"] > span[weight = "normal"]')
    items   += [item.text.strip()  for item  in items_new[c:]]
    prices  += [price.text.strip() for price in driver.find_elements(By.CSS_SELECTOR, 'div[data-testid = "product"] span[weight = "black"]')[c:]]
    volumes += [vol.text.strip()   for vol   in driver.find_elements(By.CSS_SELECTOR, 'div[data-testid = "product-name-and-metadata"] div>span:first-child')[c:]]
    counter = len(items)
    print(counter,'items scraped',end='\r')
    
    driver.execute_script('arguments[0].scrollIntoView({block: "center", behavior: "smooth"});', items_new[-1])

    items_loaded = items_new.copy()
    start = time.time()
    # wait up to `max_wait` seconds for new elements to be loaded
    while len(items_new) == len(items_loaded):
        items_loaded = driver.find_elements(By.CSS_SELECTOR, 'div[data-testid = "product-name-and-metadata"] > span[weight = "normal"]')
        if time.time() - start > max_wait:
            no_new_items = True
            break
    if no_new_items:
        break

pd.DataFrame({'item':items,'price':prices,'volume':volumes})

Выход

Привет Sound Wave, не могли бы вы поделиться со мной полным списком кода? Потому что я попытался скопировать приведенный выше код, но получил ошибку, которую не понимаю. Также как отключить страницу автоматизации тестирования во время выполнения кода. Большое спасибо заранее

jjbkd 15.02.2023 01:32

@jjbkd Я обновил ответ, добавив полный код, проверьте! Что вы подразумеваете под «тестовой страницей автоматизации»?

sound wave 15.02.2023 09:06

Большое спасибо, я имею в виду браузер Chrome, когда вы запускаете код, браузер автоматически запускается для имитации прокрутки. Да, я скопировал код, но как мне установить путь, который я пробовал, chromedriver_path = 'C:\\Users\\jjbkd\\Desktop\\Python_Webscraper\\, но он не работает. спасибо

jjbkd 15.02.2023 09:28

@jjbkd попробуйте заменить driver = webdriver.Chrome(service=Service(chromedriver_path)) на driver = webdriver.Chrome() и дайте мне знать

sound wave 15.02.2023 09:30

Да может работать после того, как я верну это к своему старому коду: время импорта импортировать панды как pd из селена Служба #chromedriver_path = 'C:\\Users\\jjbkd\\Desktop\\Python_Webscraper\\' #driver = webdriver.Chrome(service=Service(chromedriver_path)) driver = webdriver.Chrome()

jjbkd 15.02.2023 09:41

Но как мне скрыть браузер во время выполнения кода

jjbkd 15.02.2023 09:42

@jjbkd Пока скрипт работает, вы можете переключать окна и делать что-то еще, вы имеете в виду это? Или вам нужен безголовый браузер?

sound wave 15.02.2023 09:53

Да безголовый браузер, что я имею в виду, я пробовал много способов, он не может работать, поэтому я не знаю, как это сделать

jjbkd 15.02.2023 10:04

@jjbkd Вы должны запустить это options = webdriver.ChromeOptions(), затем options.add_argument("--headless=new") и, наконец, driver = webdriver.Chrome(options=options)

sound wave 15.02.2023 10:55

Ты молодец получилось!!! Большое спасибо за это, кстати, у вас есть какой-нибудь рекомендуемый сайт или книга по python для начинающих, потому что я пытаюсь изучить python, некоторые сайты слишком сложны для понимания

jjbkd 15.02.2023 14:40

@jjbkd смотри, здесь много хороших бесплатных курсов coursera.org/search?query=python

sound wave 15.02.2023 15:14

Отмечено с большой благодарностью

jjbkd 16.02.2023 01:44

Привет, @soundwave, извините за беспокойство, не могли бы вы снова объяснить этот код, что он означает «span[weight = "normal"] ,"span[weight = "black"]', ">span:first-child'" и print( counter,'items scraped',end='\r') Я пытаюсь понять, что ваш код не может быть найден в Google, спасибо

jjbkd 17.02.2023 10:04

@jjbkd span[weight = "normal"] нацелен на этот диапазон, аналогично тому, что с weight=black. Чтобы понять >span:first-child, вы можете проверить здесь. Наконец, о print(counter,'items scraped',end='\r') Я думаю, вы не знаете, что такое end='\r', ну, он просто перемещает курсор в начало строки, так что следующий отпечаток перезапишет предыдущий. Попробуйте удалить ,end='\r' и посмотрите, что произойдет

sound wave 17.02.2023 15:43

Еще раз спасибо @soundwave, я прочитаю ссылку и попробую удалить end='\r'

jjbkd 18.02.2023 07:45

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