Я пытаюсь просмотреть веб-сайт в Интернете, он показывает только 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)
Конец кода
Привет @ Rasjani, я пытался использовать Google для этого, но почему-то не могу найти способ решить эту проблему, а также скрыть автоматическую тестовую страницу.
Возможно, вам придется ввести некоторое псевдослучайное время ожидания между каждым действием, чтобы вас не считали ботом, или заплатить за помощь с капчей (веб-сайты, которые решают капчи, используют людей и имеют API). Капчу нелегко обойти, но на этом же форуме есть несколько тем с некоторыми предложениями. Никто не знает надежного способа обойти капчу.
Я думаю, проблема в том, что сайт загрузил только новый элемент, когда прокрутка вниз загрузит новый элемент. Я до сих пор не нашел, как сделать его автоматически прокручиваемым
Мое предложение состоит в том, чтобы определить три списка (элементы, цены, объемы), которые будут постепенно увеличиваться при прокрутке страницы вниз. Если у вас есть список 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 Я обновил ответ, добавив полный код, проверьте! Что вы подразумеваете под «тестовой страницей автоматизации»?
Большое спасибо, я имею в виду браузер Chrome, когда вы запускаете код, браузер автоматически запускается для имитации прокрутки. Да, я скопировал код, но как мне установить путь, который я пробовал, chromedriver_path = 'C:\\Users\\jjbkd\\Desktop\\Python_Webscraper\\, но он не работает. спасибо
@jjbkd попробуйте заменить driver = webdriver.Chrome(service=Service(chromedriver_path)) на driver = webdriver.Chrome() и дайте мне знать
Да может работать после того, как я верну это к своему старому коду: время импорта импортировать панды как pd из селена Служба #chromedriver_path = 'C:\\Users\\jjbkd\\Desktop\\Python_Webscraper\\' #driver = webdriver.Chrome(service=Service(chromedriver_path)) driver = webdriver.Chrome()
Но как мне скрыть браузер во время выполнения кода
@jjbkd Пока скрипт работает, вы можете переключать окна и делать что-то еще, вы имеете в виду это? Или вам нужен безголовый браузер?
Да безголовый браузер, что я имею в виду, я пробовал много способов, он не может работать, поэтому я не знаю, как это сделать
@jjbkd Вы должны запустить это options = webdriver.ChromeOptions(), затем options.add_argument("--headless=new") и, наконец, driver = webdriver.Chrome(options=options)
Ты молодец получилось!!! Большое спасибо за это, кстати, у вас есть какой-нибудь рекомендуемый сайт или книга по python для начинающих, потому что я пытаюсь изучить python, некоторые сайты слишком сложны для понимания
@jjbkd смотри, здесь много хороших бесплатных курсов coursera.org/search?query=python
Отмечено с большой благодарностью
Привет, @soundwave, извините за беспокойство, не могли бы вы снова объяснить этот код, что он означает «span[weight = "normal"] ,"span[weight = "black"]', ">span:first-child'" и print( counter,'items scraped',end='\r') Я пытаюсь понять, что ваш код не может быть найден в Google, спасибо
@jjbkd span[weight = "normal"] нацелен на этот диапазон, аналогично тому, что с weight=black. Чтобы понять >span:first-child, вы можете проверить здесь. Наконец, о print(counter,'items scraped',end='\r') Я думаю, вы не знаете, что такое end='\r', ну, он просто перемещает курсор в начало строки, так что следующий отпечаток перезапишет предыдущий. Попробуйте удалить ,end='\r' и посмотрите, что произойдет
Еще раз спасибо @soundwave, я прочитаю ссылку и попробую удалить end='\r'
Прокрутите окно просмотра вниз, пока не перестанете получать обновления, а затем передайте материал в BS. Если вам нужно найти более подробную информацию в Google, вы ищете, как справиться с ленивой загрузкой с помощью селена.