Возвращать ссылки страницы с пуговицей видеть больше

Я пробую получать информацию о страницах всех соединений этого Веба. Я использую BeautifulSoup и Selenium. Проблема, которая у меня есть, состоит в том, что я не могу получать все соединения страницы, чтобы после соглашаться на них и получать информацию о каждой из Ваших страниц.

Это кодекс:

from bs4 import BeautifulSoup as soup
from selenium import webdriver
import time

url_meva = "https://www.recetasgratis.net"

navegador = webdriver.Chrome()
navegador.get(url_meva)

html = navegador.page_source
element_boto = navegador.find_element_by_xpath("/html/body/div[1]/div[3]/div[1]/div[2]/button")
element_boto.click()

last_height = 0
new_height = 1

while last_height < new_height:
    last_height = navegador.execute_script("return document.body.scrollHeight")
    time.sleep(2)
    print("last height: ", last_height)
    navegador.execute_script("return document.body.scrollBy(0,1000)")
    new_height = navegador.execute_script("return document.body.scrollHeight")
    print("new height: ", new_height)
    total_receptes = navegador.execute_script('''
                var total = document.getElementsByClassName('bloque link').length;
                return total;
                ''')
receptes = []
for item in range(total_receptes):


desc_item = navegador.execute_script(f'''
            var desc = document.getElementsByClassName('bloque link')[{item}].getElementsByTagName('img')[0].getAttribute('alt');
            return desc;
            ''')

href_item = navegador.execute_script(f'''
        var href = document.getElementsByClassName('bloque link')[{item}].getElementsByTagName('img')[0].getAttribute('src');
        return href;
        ''')
 receptes.append([desc_item,href_item]) 

 print(total_receptes)

То, что я хочу сделать как первый шаг состоит в том, чтобы охранять все соединения, которые появляются на начальной странице, чтобы после открывать их одному один и получать информацию о страницах.

Он не дает мне никакой ошибки. Проблема состоит в том, что на начальной странице не появляются все соединения. Нужно нажимать пуговицу Quiero ver больше для того, чтобы были загружены соединения по мере того, как ты делаешь scroll. Несмотря на то, что я кликаю в вышеупомянутой пуговице я не могу увидеть все соединения.

Проблема состоит в том, что я не знаю, как способствовать тому, чтобы у переменной new_height было новое значение, сделав scroll. Чтобы делать scroll я использую боевую группу javascript scrollBy (). Но назначив это в new_height используя scrollHeight, () Вы не назначаете это мне. Значения new_height и last_height заканчивают тем, что являются равными во втором повторении.

Как я могу упорядочивать это?

Спасибо

3
задан 09.11.2019, 20:44
1 ответ

Хороший я попробую помогать тебе, чтобы начинаться, не докуда он подходит близко делая scroll в этой pГЎgina. AsГ - что подобно примеру, я сделал простого scroll 5 раз каждый 1seg. Ты можешь использовать Selenium, чтобы выполнять cГіdigo javascript с .execute_script

url_meva = "https://www.recetasgratis.net"
browser.get(url_meva)

Click в кнопке "Я хочу видеть mГЎs":

browser.execute_script('''
document.getElementsByClassName('boton l margin-bottom-3')[0].click();
''')
last_height = browser.execute_script("return document.body.scrollHeight")
SCROLL_DOWN = 5
for _ in range(SCROLL_DOWN):

    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
    new_height = browser.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height



#Obtener la cantidad de recetas
cantidad_recetas = browser.execute_script('''
                    var cantidad = document.getElementsByClassName('bloque link').length;
                    return cantidad;
                    ''')
recetas = []
for item in range(cantidad_recetas):


    desc_item = browser.execute_script(f'''
                var desc = document.getElementsByClassName('bloque link')[{item}].getElementsByTagName('img')[0].getAttribute('alt');
                return desc;
                ''')

    href_item = browser.execute_script(f'''
            var href = document.getElementsByClassName('bloque link')[{item}].getElementsByTagName('img')[0].getAttribute('src');
            return href;
            ''')
    recetas.append([desc_item,href_item])

Ну, что я делаю в первом for, он состоит в том, чтобы делать scroll. Если ты хочешь загрузиться mГЎs, только ты должен изменять переменную SCROLL_DOWN. Потом мы ищем количество items, у которого есть она pГЎgina, и добавляем их к списку. Я надеюсь, что он ты помогает.

pd: в тебя navegador, это definГ - как browser

И ты можешь сохранять это в одном excel таким образом:

df = pd.DataFrame(recetas)

df.to_excel('recetas.xlsx')

.to_excel() Получает как параметр, каталог, где хочешь сохранять ты .xlsx

ActualizaciГіn:

, Если ты хочешь получить все соединения ее pГЎgina, только ты должен делать loop, сходный со следующим, где sГіlo romperГЎ, когда уже не будет возможно делать scroll. Таким образом, deberГ, - чтобы тебя функционировать:

last_height = browser.execute_script("return document.body.scrollHeight")

while True:

    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
   #se puede agregar un sleep mas alto si no llega a cargar a tiempo.
    time.sleep(5)
    new_height = browser.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

, дав ему один KeyboardInterrupt, я получил 13.000 средств после нескольких минут.

OpciГіn 2:

Другая soluciГіn, что со мной случается, может состоять в том, чтобы использовать timedelta, и делать scroll определенное время, которое ты перемещал бы его из-за параметра, пример может быть следующим:

В этом случае harГЎ scroll в течение 35 минут. Если ты хочешь распределить mГЎs время (например час, ты должен проходить с ним по параметру "hour = X", я чувствую X количество часов).

from datetime import timedelta 
import datetime

start =  datetime.datetime.now() + timedelta(minutes = 35)
while start >= datetime.datetime.now():

    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

и потом получать количество средств:

#Obtener la cantidad de recetas
cantidad_recetas = browser.execute_script('''
                    var cantidad = document.getElementsByClassName('bloque link').length;
                    return cantidad;
                    ''')
recetas = []
1
ответ дан 01.12.2019, 12:16
  • 1
    Спасибо за ответ Лукас. Но сейчас у меня есть другая проблема. Поместив твой có я говорю, что у меня выходит различная стоимость каждый раз, когда я выполняю рукописный шрифт. Стоимость má s высота, которая появилась у меня, была 1639 ссылок со стоимостью SCROLL_DWON = 5000. Другой стоимости было 57 с SCROLL_DOWN = 5 и 179 с SCROLL_DOWN = 50. Я очень далеко приблизительно 25000 ссылок, что deberí посмотрим. Именно поэтому я буду ретушировать вопрос с новым có я говорю, что я сделал объясняя мою новую проблему. – axmug 09.11.2019, 20:21
  • 2
    Ok. Estaré я совершаю покушение, чтобы издавать ответ и помогать тебе. – Lucas Damian 09.11.2019, 20:28

Теги

Похожие вопросы