一. 问题描述

有一些特殊网页,需要模拟点击并且有时候需要拖动滚动条才能显示完整的内容,举一个例子,比如人民日报客户端的网页,如下图所示:

需要点击阅读全文才能显示完整的内容,并且网页的图片需要拖动滚动条到图片的位置才能显示图片内容,如果需要获取这种网页的内容,我们可以使用 python + selenium 模拟浏览器的行为来获取。

二. 解决方法

关于 selenium 的安装与使用可以查看这篇文章:https://juejin.cn/post/6996973391328575525

1. 使用 js 脚本直接拖动滚动条到底部

# document.body.scrollHeight 是用来获取滚动条的高度
js = 'window.scrollTo(0, document.body.scrollHeight)'
driver.execute_script(js)

或者

js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)

2. 使用 js 脚本拖动滚动条到指定位置

target = driver.find_element_by_class_name("class_name")
driver.execute_script("arguments[0].scrollIntoView();", target) # 拖动到可见的元素去

这个方法可以将滚动条拖动到需要显示的元素位置,此方法用途比较广。

比如需要拖动滚动条到最后一个图片显示的位置,可以使用下面的方式:

time.sleep(1)
# 使用 xpath 获取最后一个图片
target = driver.find_element_by_xpath('(//img)[last()]')
driver.execute_script("arguments[0].scrollIntoView();", target)  # 拖动到可见的元素去

对于图片网站,通过滚动条下拉加载图片就可以使用上述方式实现。

3. 使用 js 脚本缓慢拖动滚动条

有的网页图片需要拖动滚动条到图片的位置才能显示图片内容,可以使用下面的方式缓慢拖动滚动条:

js = "return document.body.scrollHeight"
# 获取滚动条的高度
new_height = driver.execute_script(js)
for i in range(0, new_height, 350):time.sleep(0.05)driver.execute_script('window.scrollTo(0, %s)' % i)

这里实现方式是,先获取滚动条的高度,再通过 range(start, stop, step) 函数每次 350 的间距拖动。

4. selenium 如何判断元素是否存在

第一种方式:捕获异常

def isElementExist(driver, class_name):try:el = driver.find_element_by_class_name(class_name)return Trueexcept Exception as e:logging.error(e)return False

第二种方式:find_elements 方法

def is_element_exist(driver, class_name):el = driver.find_elements_by_class_name(class_name)if len(el) > 0:return Trueelse:return False

四. 获取客户端网页数据的完整代码

import timefrom lxml import etree
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWaitdef get_news_content(url):"""解析网页内容:param url: :return: """html = html_selenium_firefox(url)tree = etree.HTML(html)title = tree.xpath('//h1[@class="title"]/text()')[0]pubtime = tree.xpath('//span[@class="pr10"]/text()')pubtime = pubtime[0] if len(pubtime) > 0 else ''source = tree.xpath('//span[@class="pr10 head-info-copyfrom"]/text()')source = source[0] if len(source) > 0 else '人民日报'img_urls = tree.xpath('//img/@src')result = {"title": title,"pubtime": pubtime,"source": source,"img_urls": img_urls,}return resultdef html_selenium_firefox(url):"""使用 selenium 获取网页内容:param url: :return: """driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub',desired_capabilities=DesiredCapabilities.FIREFOX,)# 隐式等待driver.implicitly_wait(10)# 请求页面driver.get(url)# 显式等待:显式地等待某个元素被加载wait = WebDriverWait(driver, 5)wait.until(EC.presence_of_element_located((By.TAG_NAME, 'span')))handle_selenium_content(driver, url)time.sleep(2)html = driver.page_sourcedriver.quit()return htmldef handle_selenium_content(driver, url):"""模拟点击和滚动滚动条:param driver: :param url: :return: """if 'wap.peopleapp.com' in url:class_name = 'read-more-zhankai'if is_element_exist(driver, class_name):i = driver.find_element_by_class_name(class_name)i.click()js = "return document.body.scrollHeight"new_height = driver.execute_script(js)for i in range(0, new_height, 350):time.sleep(0.05)driver.execute_script('window.scrollTo(0, %s)' % i)def is_element_exist(driver, class_name):"""判断元素是否存在:param driver: :param class_name: :return: """el = driver.find_elements_by_class_name(class_name)if len(el) > 0:return Trueelse:return Falseif __name__ == '__main__':url = "https://wap.peopleapp.com/article/6305024/6198096"result = get_news_content(url)print(result)

参考文档:

https://zhuanlan.zhihu.com/p/343516637

https://www.cnblogs.com/landhu/p/5761794.html

selenium 如何拖动滚动条?相关推荐

  1. 小程序数据框有重影_关于拖动滚动条编辑框数据重影的问题

    你的位置: 问答吧 -> C/C++ -> 问题详情 关于拖动滚动条编辑框数据重影的问题 我用VC++做了一个编辑框,并设置有垂直滚动条.当编辑框中的数据太多时,此时滚动条可用.我在拖动滚 ...

  2. 基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像

    基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像,并动态显示曲线上的数值点 在工控.采集.测试类项目中经常需要对采集接收回来的数据进行图像.曲线显示,本人在项目 ...

  3. 鼠标中键按下拖动滚动条(平移视图)

    鼠标中键按下拖动滚动条(平移视图) 以下代码演示了鼠标中键在客户区拖动时,滚动条随之滚动的方法.其实就是用鼠标平移视图了.   示例代码下载:鼠标中键按下拖动滚动条(平移视图).zip (请不要直接使 ...

  4. 滚轮事件和拖动滚动条事件

    一.鼠标的滚轮事件 触发: 鼠标的滚轮上下滑动的时候触发 代码: // DOMMouseScroll:火狐 // onmousewheel:其他浏览器 if(window.addEventListen ...

  5. excel 拖动滚动条_滚动条更改Excel图表标题

    excel 拖动滚动条 Last week, I shared a tip for using a scroll bar to change the date range in a report. T ...

  6. excel 拖动滚动条_使用Excel滚动条修剪圣诞树

    excel 拖动滚动条 An Excel scroll bar can be used for practical (and sometimes boring) things, like testin ...

  7. Selenium入门11 滚动条控制(通过js)

    这一节要有js基础.做web端的UI自动化必须要有html,css,javascript前端基础. 滚动条控制: 1 移动垂直滚动条 document.documentElement.scrollTo ...

  8. python爬虫拖动滚动条到底部/顶部/指定元素处

    # 将滚动条移动到页面的底部 js = "var q=document.documentElement.scrollTop=100000" driver.execute_scrip ...

  9. selenium中拖动鼠标通过滑动验证码(geetest)验证

    先快后慢拖动鼠标 Actions action = new Actions(driver); long d1 = Math.round(xDis*0.8); long d2 = Math.round( ...

最新文章

  1. 自从用完 Gradle 后,有点嫌弃 Maven 了!速度贼快!
  2. 一个人会python能做什么_利用Python来预测一个人有没有女朋友!无所不能!
  3. redis安装(windows)
  4. 用Java编写模仿的太阳系(九星行旋转)--原创
  5. [开源]基于姿态估计的运动计数APP开发(一)
  6. python cookies过期_Python3中关于cookie的创建与保存
  7. 机器学习基石笔记5——为什么机器可以学习(1)
  8. bzoj2705Longge的问题
  9. Linux - 有效群组(effective group)与初始群组(initial group),groups,newgrp
  10. ubuntu18.04 pcl1.9需要的依赖库
  11. HW 基于接口/全局地址池的DHCP
  12. 数据血缘关系图 工具_QCSPCChart SPC控制图工具,QCSPCChart SPC精湛而轻松
  13. vue 局部回到顶部_VUE回到顶部功能
  14. PR曲线与ROC曲线
  15. 【报表福利大放送】100余套报表模板免费下
  16. 货币供应量(年底余额)的意义,如何获取
  17. 2022年茶艺师(初级)考试题库及茶艺师(初级)作业考试题库
  18. 立创EDA学习笔记(3)——PCB绘制
  19. Word2Vec--词向量模型
  20. Beijing's 798 Biennale Kicks Off With Controversy

热门文章

  1. 3D建模需要什么电脑配置?什么样的电脑可以建模?
  2. CentOS 6.X如何更改网卡名称
  3. 基于JavaWeb的保护动物管理系统设计与实现
  4. 在网页中显示数学公式
  5. 火车车次前面的各种字母分别代表什么含义?
  6. 国内券商有没有提供股票交易接口的?
  7. 简单的6个步骤,告诉你核心论文如何发表
  8. 1044 - Access denied for user ‘root‘@‘%‘ to database
  9. 使用ArcGIS API for Silverlight + Visifire绘制地图统计图
  10. 从全球座舱电子市场与产业看汽车级Linux(AGL)android-auto