Python Web Scraping Selenium + BeautifulSoup с gspread и проблемой Google Sheets с большими объемами данныхPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python Web Scraping Selenium + BeautifulSoup с gspread и проблемой Google Sheets с большими объемами данных

Сообщение Anonymous »

Я создаю веб-парсер, который собирает все данные с этой страницы примерно по 1500 товарам.
Я извлекаю название товара, если он является бестселлером, что это за одежда, сколько цветов в наличии и цена. Все извлекается по той же ссылке с BeautifulSoup.

Код: Выделить всё

for item in items:
name = item.find('a', class_ = 'product-card__link-overlay').text.strip()
try:
special_tag = item.find('div', class_ = 'product-card__messaging accent--color').text.strip()
except:
special_tag = '/'
productclass = item.find('div', class_ = 'product-card__subtitle').text.strip()
colours = item.find('div', class_ = 'product-card__product-count').text.strip()
try:
price = item.find('div', class_ = 'product-price us__styling is--current-price css-11s12ax').text.strip()
except:
price = item.find('div', class_ = 'product-price is--current-price css-1ydfahe').text.strip()
product = {'name':name, 'special':special_tag, 'class':productclass, 'colours':colours, 'price':price}
sh.append_row([str(product['name']),str(product['special']),str(product['class']),str(product['colours']),str(product['price'])])
Чтобы извлечь все, я использовал Selenium, чтобы прокрутить всю страницу и загрузить ее целиком.

Код: Выделить всё

time.sleep(3)
previous_height = driver.execute_script('return document.body.scrollHeight')

while True:
driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')

time.sleep(3)

new_height = driver.execute_script('return document.body.scrollHeight')

if new_height == previous_height:
page_source = driver.page_source
break
previous_height = new_height
После того, как я извлек исходный код страницы и использовал его в BeautifulSoup, возникла проблема. Я перепробовал все, что только мог придумать, даже поискал в Интернете, но это все равно не помогло. Программа извлекает всего около 65-70 продуктов и внезапно останавливается.
Весь код только для справки:

Код: Выделить всё

from bs4 import BeautifulSoup
import gspread
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

gc = gspread.service_account(filename='creds.json')
sh = gc.open('Nike catalog').sheet1

driver.get('https://www.nike.com/w/mens-clothing-6ymx6znik1')

#Scroll program
time.sleep(3)
previous_height = driver.execute_script('return document.body.scrollHeight')

while True:
driver.execute_script('window.scrollTo(0,document.body.scrollHeight);')

time.sleep(3)

new_height = driver.execute_script('return document.body.scrollHeight')

if new_height == previous_height:
page_source = driver.page_source
break
previous_height = new_height

#Main program
baseurl='https://www.nike.com/w/mens-clothing-6ymx6znik1'

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36'}

soup = BeautifulSoup( page_source,'lxml')

items = soup.find_all('div', class_ = 'product-card__body')

#HTML parser
for item in items:
name = item.find('a', class_ = 'product-card__link-overlay').text.strip()
try:
special_tag = item.find('div', class_ = 'product-card__messaging accent--color').text.strip()
except:
special_tag = '/'
productclass = item.find('div', class_ = 'product-card__subtitle').text.strip()
colours = item.find('div', class_ = 'product-card__product-count').text.strip()
try:
price = item.find('div', class_ = 'product-price us__styling is--current-price css-11s12ax').text.strip()
except:
price = item.find('div', class_ = 'product-price is--current-price css-1ydfahe').text.strip()
product = {'name':name, 'special':special_tag, 'class':productclass, 'colours':colours, 'price':price}
sh.append_row([str(product['name']),str(product['special']),str(product['class']),str(product['colours']),str(product['price'])])

Я просмотрел всю загруженную страницу и убедился, что HTML-классы и код одинаковы для каждого из продуктов. Возможно это какой-то запрет, который Найк встроил на свой сайт, я никаких прокси не использую. Я также пропустил исключения, но это не сработало.
Я не знаю, как это исправить. Кто-нибудь сталкивался с такой же проблемой или имел опыт в чем-то подобном? Если вы это сделаете, мы будем очень признательны, если вы сможете решить эту проблему. Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ets-proble
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»