使用 Python/PhantomJS/Selenium 滚动无限页面

Posted

技术标签:

【中文标题】使用 Python/PhantomJS/Selenium 滚动无限页面【英文标题】:Scrolling infinite page with 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 【参考方案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

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

【讨论】:

以上是关于使用 Python/PhantomJS/Selenium 滚动无限页面的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)