Прокрутка селена вниз страницы иногда останавливается - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть страница, которую можно прокручивать вниз до бесконечности (для иллюстрации я буду использовать страницу https://www.reuters.com/news/us, которая показывает более старые новости каждый раз, когда вы прокручиваете страницу вниз) ). Я хочу прокрутить вниз до нижней части страницы, чтобы загрузить старые элементы много раз, используя селен. Следующий код работает в принципе:

driver = webdriver.Chrome(executable_path=r"/Users/bernhardclemm/Desktop/chromedriver")
driver.get('https://www.reuters.com/news/us')

# Accept Cookies
wait = WebDriverWait(driver, 5)
cookies = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@id='_evidon-banner-acceptbutton']")))
cookies.click()

# Switch of "Photos" to speed up loading
wait = WebDriverWait(driver, 5)
photos_off = wait.until(EC.element_to_be_clickable((By.XPATH, "//label[contains(text(),'Photos')]")))
photos_off.click()

# Scroll down 100 times
i  = 1
while i < 500:
    print(i)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    i += 1
    time.sleep(1)

Как вы можете видеть в следующем GIF, для каждого поворота в l oop (i напечатано на консоли Python справа), драйвер Selenium прокручивается вниз один раз (Google Chrome слева).

enter image description here

Однако иногда драйвер Selenium достигает нижней части страницы. но новый контент не загружается, как это показывает GIF. Обратите внимание, что l oop все еще работает в Python:

enter image description here

Когда я немного прокручиваю вверх в Chrome вручную , автоматическая c прокрутка начинается снова. Так что это , а не , потому что сайт достиг своего конца.

Есть идеи, связано ли это с веб-сайтом или с ошибкой в ​​моем коде? Если что-то связано с веб-сайтом, как можно избежать проблемы с Selenium?

1 Ответ

1 голос
/ 06 апреля 2020

Я бы предложил проверить элемент Loading more div, чтобы он исчез. Используйте try..except блок проверки. Если он не найдет элемент Loading more, то выполните бит scroll up на странице. Время выполнения будет немного больше. Однако вы добьетесь того, чего хотите.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path=r"/Users/bernhardclemm/Desktop/chromedriver")
driver.get('https://www.reuters.com/news/us')

# Accept Cookies - you will have to adapt the XPATH to your system language
wait = WebDriverWait(driver, 5)
cookies = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#_evidon-banner-acceptbutton")))
cookies.click()

# Scroll down 100 times
i  = 1

while i < 500:
    print(i)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    i += 1
    try:
       WebDriverWait(driver,3).until(EC.invisibility_of_element_located((By.XPATH,"//div[contains(.,'Loading more')]")))
    except:
        print('Re-try.........')
        #scroll page up to certain limit
        driver.find_element_by_tag_name("body").send_keys(Keys.UP)
        time.sleep(1)

Выход :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Re-try.........
30
31
32
33
Re-try.........
34
35
36
37
38
Re-try.........
39
40
41
Re-try.........
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Re-try.........
81
82
83
84
85
Re-try.........
86
87
88
Re-try.........
89
90
91
Re-try.........
92
Re-try.........
93
94
95
96
97
98
99
100
101
102
103
Re-try.........
104
105
106
107
Re-try.........
108
Re-try.........
109
110
Re-try.........
111
112
113
114
115
116
117
Re-try.........
118
119
Re-try.........
120
121
122
123
Re-try.........
124
Re-try.........
125
126
127
128
Re-try.........
129
130
Re-try.........
131
132
133
134
Re-try.........
135
136
137
Re-try.........
138
Re-try.........
139
140
141
Re-try.........
142
143
Re-try.........
144
Re-try.........
145
Re-try.........
146
147
148
Re-try.........
149
Re-try.........
150
Re-try.........
151
152
Re-try.........
153
154
Re-try.........
155
Re-try.........
156
Re-try.........
157
158
Re-try.........
159
Re-try.........
160 and son on...
...