РЕДАКТИРОВАТЬ: Возможный дубликат не решает мой вопрос, потому что я пытался использовать безголовый браузер без успеха.Этот вопрос не объясняет, как использовать браузер без головы для выполнения этой или подобной задачи.
Я перебираю эту страницу:
https://www.finishline.com/store/men/shoes/_/N-1737dkj?mnid=men_shoes#/store/men/shoes/nike/adidas/jordan/under-armour/puma/new-balance/reebok/champion/timberland/fila/lacoste/converse/_/N-1737dkjZhtjl46Zh51uarZvnhst2Zu4e113Z16ggje2Z1alnhbgZ1lzobj2Z7oi4waZ1hzyzukZm0ym0nZj4k440Zdshbsy?mnid=men_shoes
Первые 12 продуктовзагружаются автоматически (не используя JS), а затем другие (я полагаю, 48?) продукты загружаются после небольшой прокрутки пользователем.
Этот фрагмент:
import requests
import csv
import io
import os
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from datetime import datetime
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
url_list2 = []
data2 = requests.get("https://www.finishline.com/store/men/shoes/_/N-1737dkj?mnid=men_shoes#/store/men/shoes/nike/adidas/jordan/under-armour/puma/new-balance/reebok/champion/timberland/fila/lacoste/converse/_/N-1737dkjZhtjl46Zh51uarZvnhst2Zu4e113Z16ggje2Z1alnhbgZ1lzobj2Z7oi4waZ1hzyzukZm0ym0nZj4k440Zdshbsy?mnid=men_shoes",headers=headers)
soup2 = BeautifulSoup(data2.text, 'html.parser')
x = soup2.findAll('div', attrs={'class': 'product-card'})
for url2 in x:
get_urls = "https://www.finishline.com"+url2.find('a')['href']
url_list2.append(get_urls)
print(url_list2)
получит 12продукты, которые не зависят от JS (это можно проверить, отключив JS в настройках Chrome).Однако на странице есть 60 (или 59) товаров, когда JS включен.
Как я могу получить все товары, используя BS4?Я также пробовал Selenium, однако, используя его, я получаю другую ошибку.
При попытке Selenium мне удалось получить все 59 продуктов, показанных на странице.Я использую этот код для получения URL-адресов всех страниц продукта для дальнейшей очистки.
import requests
import csv
import io
import os
import time
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import DesiredCapabilities
from bs4 import BeautifulSoup,Tag
page = "https://www.finishline.com/store/men/shoes/_/N-1737dkj?mnid=men_shoes#/store/men/shoes/nike/adidas/jordan/under-armour/puma/new-balance/reebok/champion/timberland/fila/lacoste/converse/_/N-1737dkjZhtjl46Zh51uarZvnhst2Zu4e113Z16ggje2Z1alnhbgZ1lzobj2Z7oi4waZ1hzyzukZm0ym0nZj4k440Zdshbsy?mnid=men_shoes"
url_list2 = []
page_num = 0
#session = requests.Session()
while page_num <1160:
driver = webdriver.Chrome()
driver.get(page)
getproductUrls = driver.find_elements_by_class_name('product-card')
for url2 in getproductUrls:
get_urls = "https://www.finishline.com"+url2.find_element_by_tag_name('a').get_attribute("href")
url_list2.append(get_urls)
print(url_list2)
driver.close()
page = "https://www.finishline.com/store/men/shoes/_/N-1737dkj?mnid=men_shoes#/store/men/shoes/nike/adidas/jordan/under-armour/puma/new-balance/reebok/champion/timberland/fila/lacoste/converse/_/N-1737dkjZhtjl46Zh51uarZvnhst2Zu4e113Z16ggje2Z1alnhbgZ1lzobj2Z7oi4waZ1hzyzukZm0ym0nZj4k440Zdshbsy?mnid=men_shoes&No={}".format(page_num)
page_num +=40
Однако через некоторое время возникает ошибка
raise exception_class(message, screen, stacktrace, alert_text)
selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: None
Message: unexpected alert open: {Alert text : something went wrong}
, так как сайт обнаружилнеобычная активность.Если бы я открывал веб-сайт finishline.com в своем браузере, я получил бы сообщение «Отказано в доступе», и мне пришлось бы очистить свои куки и обновить его, чтобы он снова заработал.Очевидно, что мой сценарий не завершается, пока не появится это сообщение.
Кто-нибудь знает решение?Заранее спасибо.