Как веб-очистить страницу, которая имеет частично статический и частично динамический контент? - PullRequest
0 голосов
/ 12 апреля 2019

РЕДАКТИРОВАТЬ: Возможный дубликат не решает мой вопрос, потому что я пытался использовать безголовый браузер без успеха.Этот вопрос не объясняет, как использовать браузер без головы для выполнения этой или подобной задачи.

Я перебираю эту страницу:

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 в своем браузере, я получил бы сообщение «Отказано в доступе», и мне пришлось бы очистить свои куки и обновить его, чтобы он снова заработал.Очевидно, что мой сценарий не завершается, пока не появится это сообщение.

Кто-нибудь знает решение?Заранее спасибо.

1 Ответ

1 голос
/ 13 апреля 2019

Содержимое доступно на странице источника. Вы не можете получить их все, используя запросы только потому, что большинство из них находятся в теге script. Кроме того, вам нужно найти соответствующий URL, который вы можете использовать для перемещения по нескольким страницам. Это правильный , который вы можете получить с помощью инструментов разработчика Chrome. В настоящее время следующий скрипт может получить 120 продуктов. Вы можете изменить диапазон по своему вкусу.

Вот как вы можете идти:

import requests
from bs4 import BeautifulSoup

url = "https://www.finishline.com/store/men/shoes/nike/adidas/jordan/under-armour/puma/new-balance/reebok/champion/timberland/fila/lacoste/converse/_/N-1737dkjZhtjl46Zh51uarZvnhst2Zu4e113Z16ggje2Z1alnhbgZ1lzobj2Z7oi4waZ1hzyzukZm0ym0nZj4k440Zdshbsy?"

qsp = {
    'mnid': 'men_shoes_nike_adidas_jordan_underarmour_puma_newbalance_reebok_champion_timberland_fila_lacoste_converse',
    'No': 0,
    'isAjax': True
}


container = []

for page_content in range(0,120,40):
    qsp['No'] = page_content
    res = requests.get(url,params=qsp,headers={"User-Agent":"Mozilla/5.0"})
    soup = BeautifulSoup(res.text, 'lxml')
    for item in soup.select(".product-card__details .product-name"):
        container.append(item.get_text(strip=True))

    for items in soup.select("script"):
        sauce = BeautifulSoup(items.text,"lxml")
        for elem in sauce.select(".product-card__details .product-name"):
            container.append(elem.get_text(strip=True))

for product in container:
    print(product)

Кстати, я могу видеть 40 продуктов на каждой странице. Возможно, количество товаров на каждой странице отличается в зависимости от страны. Измените range(0,120,40) на количество, которое вы можете увидеть на каждой странице с вашего конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...