【问题标题】:Scrolling infinite page with Python/PhantomJS/Selenium使用 Python/PhantomJS/Selenium 滚动无限页面
【发布时间】:2018-05-29 15:50:41
【问题描述】:

我正在尝试抓取这个(无限)页面(www.mydealz.de),但我无法让我的网络驱动程序向下滚动页面。 我使用 Python (3.5)、Selenium (3.6) 和 PhantomJS。 我已经尝试了几种方法,但 webdriver 只是不会滚动 - 它只是给了我第一页。

第一种方法(通常的滚动方法):

last_height = driver.execute_script("return document.body.scrollHeight")
while True:
  driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  time.sleep(1)
  new_height = driver.execute_script("return document.body.scrollHeight")
  if new_height == last_height:
       break
  last_height = new_height

第二种方法(只需按几次向下键并释放它,也尝试在两次按下之间等待):

ActionChains(driver).key_down(Keys.ARROW_DOWN).perform()
ActionChains(driver).key_up(Keys.ARROW_DOWN).perform()

第三种方法(找到“滚动列表”中的最后一个元素并滚动到其视图以强制滚动):

posts = driver.find_elements_by_css_selector("div.threadGrid")
driver.execute_script("arguments[0].scrollIntoView();", posts[-1])

到目前为止没有任何效果,有人知道是否有其他方法或我在哪里出错了吗?

【问题讨论】:

  • 你有关于页面有多少总数据的信息吗?
  • 你想要多少卷轴?或者你想收集多少元素?你想什么时候停止滚动?而是要在哪里停止滚动?
  • @DebanjanB 基本上我想滚动直到网址为mydealz.de/?page=3

标签: python selenium web-scraping phantomjs


【解决方案1】:

要滚动网页直到the url is mydealz.de/?page=3,您可以使用以下代码块:

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\\Utility\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
driver.set_window_size(1400,1000)
driver.get("https://www.mydealz.de")
while ("3" not in driver.current_url) :
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
print(driver.current_url)
driver.quit()

控制台输出:

https://www.mydealz.de/?page=3

【讨论】:

  • 谢谢,它就像一个魅力!不过我有一个问题:我也使用了行 driver.execute_script() 。但它没有用。这里成功的关键是设置窗口大小吗?
【解决方案2】:

我可以在提到的网站上看到 1853 个页面。所以你可以迭代一个循环,直到你到达最后一页。睡眠时间必须高于平均水平才能加载每个页面,尝试最小为 3,值越大,不加载数据的可能性越小。

number_of_scroll = 1857

while number_of_scroll > 0:
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)
    number_of_scroll = number_of_scroll-1

【讨论】:

    【解决方案3】:

    比使用 Selenium/PhantomJS 更简单的方法是模仿浏览器的功能。如果您在 Chrome 的开发者工具中打开“网络”选项卡,您会看到浏览器向https://www.mydealz.de/?page=2&ajax=true 发出请求以实现无限滚动。当我将请求复制为 curl 时,将其限制在它引导我的最小值

    curl 'https://www.mydealz.de/?page=2&ajax=true' -H 'x-requested-with: XMLHttpRequest'
    

    把它变成一个python脚本:

    import json, requests
    
    url = 'http://www.mydealz.de/'
    headers = {'x-requested-with': 'XMLHttpRequest'}
    
    for page in range(10):
        params = dict(page=page, ajax='true')
        resp = requests.get(url=url, params=params, headers=headers)
        data = json.loads(resp.text)
        html = data['data']['content']
        # do something with html, maybe parse it with beautifulsoup
    

    除了更简单的代码之外,它也会更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 2015-05-09
      • 2020-12-18
      • 2015-08-08
      • 2015-01-21
      • 1970-01-01
      相关资源
      最近更新 更多