繁体   English   中英

无法到达网页底部

[英]Can't reach the bottom of a webpage

我已经用python用selenium编写了一个脚本来处理无限滚动的网页。 我面临的问题是它滚动了几次然后退出浏览器。 它永远不会触底。 我也尝试了“ Explicit Wait ,但滚动次数更少。 当没有更多滚动要做时,我怎么能到达底部。

这是我的尝试:

import time
from selenium import webdriver
from urllib.parse import urljoin

url = "https://www.instagram.com/explore/tags/travelphotoawards/"

driver = webdriver.Chrome()
driver.get(url)

last_len = len(driver.find_elements_by_css_selector(".v1Nh3 a"))
new_len = last_len

while True:
    last_len = new_len
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(5)

    items = driver.find_elements_by_css_selector(".v1Nh3 a")
    new_len = len(items)
    if last_len == new_len:break

driver.quit()

编辑:

如果我尝试如下操作,则可以根据需要进行多次滚动,但这并不是一个好主意:

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

url = "https://www.instagram.com/explore/tags/travelphotoawards/"

driver = webdriver.Chrome()
driver.get(url)

for scroll in range(1,10):  #I can do the scrolling as many times as I want but it is fully hardcoded
    item = driver.find_element_by_tag_name("body")
    item.send_keys(Keys.END)
    elems = driver.find_elements_by_css_selector(".v1Nh3 a")
    time.sleep(3)

driver.quit()

我希望有任何方法可以自动进行滚动直到到达底部。

这里没什么东西。 在无限滚动的情况下,我会注意以下几点

  • 禁用图像,以便更快地滚动
  • 如果条件不一致,请不要相信条件为真。 对其进行连续一段时间的测试,如果条件一致,则信任它
  • 尽量不要滚动太久,无限滚动会导致浏览器阻塞过多的内存,有时甚至崩溃
  • 每次滚动后分批转储数据。 因此,在首页加载时,我将转储所有页面日期。 然后,每次滚动时,我都将转储增量部分。 使用xpath可以很容易地做到这一点。

以下是更新的脚本,它将为您做得更好。 不要记住没有什么是完美的,所以您需要使脚本适应失败

import time
from selenium import webdriver
from urllib.parse import urljoin

option = webdriver.ChromeOptions()
chrome_prefs = {}
option.experimental_options["prefs"] = chrome_prefs
chrome_prefs["profile.default_content_settings"] = {"images": 2}
chrome_prefs["profile.managed_default_content_settings"] = {"images": 2}


driver = webdriver.Chrome(chrome_options=option)

url = "https://www.instagram.com/explore/tags/travelphotoawards/"

driver.get(url)

last_len = len(driver.find_elements_by_css_selector(".v1Nh3 a"))
new_len = last_len

consistent = 0
while True:
    last_len = new_len
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(5)
    items = driver.find_elements_by_css_selector(".v1Nh3 a")
    new_len = len(items)
    if last_len == new_len:
        consistent += 1
        if consistent == 3:
            break
    else:
        consistent = 0

driver.quit()

每次滚动时,旧图像消失。 滚动后,您可能会得到相同数量甚至更少的图像。

每个图像都有唯一的href ,您可以将最后一个图像href与上一个最后一个图像进行比较

last_href = driver.find_elements_by_css_selector('.v1Nh3 > a')[-1].get_attribute('href')
new_href = last_href

while True:
    last_href = new_href
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(5)

    new_href = driver.find_elements_by_css_selector('.v1Nh3 > a')[-1].get_attribute('href')

    if last_href != new_href:
        break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM