用Selenium模拟页面滚动
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Selenium模拟页面滚动相关的知识,希望对你有一定的参考价值。
参考技术A TouchActions:模拟pc和h5的点击,滑动,拖拽,多点触控等多种手势操作实现方法:new_action.scroll_from_element(a, 0, 10000).perform(),10000表示滑动的偏移量,如果不知道大小,尽量最大。
示例:百度页面-输入'灵题库'-百度一下,然后滑动页面并最大化窗口
使用 Python/PhantomJS/Selenium 滚动无限页面
【中文标题】使用 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
除了更简单的代码之外,它也会更快。
【讨论】:
以上是关于用Selenium模拟页面滚动的主要内容,如果未能解决你的问题,请参考以下文章
selenium,Python3滚动到页面底部的几种解决方案
selenium+python关于页面滚动条滑动到底的问题总结