python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作
1.参考
利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
2.改进js代码,下拉和上拉,精确判断加载是否结束
#!/usr/bin/env python
# -*- coding: UTF-8 -*
import time from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.action_chains import ActionChains def scroll_page(url, browser='chrome'):
if browser=='chrome':
driver = webdriver.Chrome()
else:
driver = webdriver.Firefox() #右键异常 ActionChains(driver).context_click(e).perform()
# driver = webdriver.PhantomJS() #可截长图!可是加载长网页时间超长?
driver.set_window_size(1200, 900)
driver.get(url) # Load page
start = time.time() print driver.title
driver.execute_script("""
(function () {
var y = 0;
var step = 1000; //100
window.scroll(0, 0); function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 100); //100 递归循环调用
}
else {
if(document.title.indexOf("scroll-done") < 0){ //-1 找不到,还没执行下文的driver.execute_script
y -= step;
window.scroll(0, y);
setTimeout(f, 100); //100
//window.scroll(0, 0);
//document.title += "scroll-done";
}
//else{
//window.scroll(0, 0);
//}
}
} setTimeout(f, 1000); //1000
})();
""")
#拉到最后 出现元素“没有更多了”
WebDriverWait(driver, 500).until(lambda x: x.find_element_by_xpath('//div[@style="text-align:center"]/em')) #或者引发 TimeoutException #停止上面的js到终点再上拉 循环
driver.execute_script("""
(function () { function f() {
document.title += " scroll-done";
} setTimeout(f, 1000);
})();
""")
# <div class="js-infinite-layout">
# <div class="js-infinite-item">
# Jetbrains公司正式发布Pycharm 5
rst = driver.find_element_by_xpath('//div[@class="js-infinite-item"][last()]//div[@class="header"]').text #不能在path内部写入 text()
print rst
if rst != u'Jetbrains公司正式发布Pycharm 5':
raise RuntimeError('wrong!!!')
print time.time()-start
print driver.title
# time.sleep(3) #执行js也需要时间
WebDriverWait(driver, 10).until(lambda x: x.title == u'编程派 | Coding Python scroll-done') #或者引发 TimeoutException
print driver.title
return driver
3.通过pid进程号和窗口标题定位窗口并前置
import win32con
import win32gui
import win32process
import psutil def get_hwnds_for_pid (pid):
def callback (hwnd, hwnds):
if win32gui.IsWindowVisible(hwnd) and win32gui.IsWindowEnabled(hwnd):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
hwnds.append(hwnd)
return True
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds def set_process_foreground(pid_part_name, pid_window_text):
pids_target = []
for pid in psutil.pids():
p = psutil.Process(pid)
if pid_part_name in p.name().lower(): #'chrome.exe' 'EXCEL.EXE'
pids_target.append(pid) for pid in pids_target:
for hwnd in get_hwnds_for_pid(pid):
# 92292 chrome.exe 137328 编程派 | Coding Python - Google Chrome
# EXCEL.EXE 857830 Microsoft Excel - Book1.xlsx
# 90644 firefox.exe 595556 编程派 | Coding Python scroll-done - Mozilla Firefox if pid_window_text.encode('gbk') in win32gui.GetWindowText(hwnd):
print pid, psutil.Process(pid).name(), hwnd, win32gui.GetWindowText(hwnd)
win32gui.SetForegroundWindow(hwnd)
return
raise RuntimeError('process not found')
4.通过autopy实现右键操作,以及网页另存为
from autopy import key, mouse
def save_result(driver):
time_for_filename = time.strftime('%H%M%S')
with open('%s.html'%time_for_filename,'wb') as f:
f.write(driver.page_source.encode('utf-8')) # e = driver.find_element_by_xpath('//img[@src="/static/images/logo.png"]')
# ActionChains(driver).context_click(e).perform()
# time.sleep(1.5)
# esc 退出右键菜单
# key.tap(key.K_ESCAPE)
# driver.set_window_position(0,0)
# window_position = driver.get_window_position() # {u'x': 10, u'y': 10}
# mouse.move(int(window_position['x']+150), int(window_position['y']+150))
#右键再左键 避免错误点开链接
# mouse.click(mouse.RIGHT_BUTTON)
# mouse.click(mouse.LEFT_BUTTON) # 关键是浏览器位于foreground
set_process_foreground(driver.name,driver.title)
key.tap('s', key.MOD_CONTROL)
time.sleep(1.5)
key.type_string(time_for_filename)
time.sleep(0.5)
key.tap(key.K_RETURN) driver.save_screenshot('%s.png'%time_for_filename)
# driver.close() if __name__ == "__main__":
browser = 'chrome'
# browser = 'firefox'
url = "http://codingpy.com"
driver = scroll_page(url,browser)
save_result(driver)
print 'All DONE'
python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作的更多相关文章
- JS控制滚动条的位置
转载▼http://blog.sina.com.cn/s/blog_4481a3460100rwwu.html JS控制滚动条的位置:window.scrollTo(x,y); 竖向滚动条置顶 ...
- python+selenium+js 处理滚动条
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...
- Selenium3+python自动化 -JS处理滚动条
selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...
- js控制滚动条的位置以及隐藏滚动条
document.documentElement.style.overflow = 'hidden'; //隐藏横竖滚动条 window.scrollTo(0,document.body.scroll ...
- python 写了一个批量拉取文件进excel文档
路径如: C:\\Users\\huaqi\\Desktop\\信息收集 “信息收集”目录下有以下子目录:[技术,客服,运营,行政] “技术”目录下有以下子文件:[小白.txt,小红.txt,小黑.t ...
- 《selenium2 python 自动化测试实战》(15)——调用js控制滚动条等操作
看代码: # coding=utf-8 from time import sleepfrom selenium import webdriver driver = webdriver.Firefox( ...
- 爬虫实例——通过JS控制滚动条
案例 某位淘女郎的某个相册 有能力的童鞋可以先尝试一下爬取每张照片的链接. 我曾经尝试过几种方法,下面一一介绍: 第一种方法,采用requests和BeautifulSoup: import requ ...
- Js控制滚动条
1>全局控制 //向上滑动显示 var initTop = 0; var i = 1; $(window).scroll(function(){ var scrollTop = $(docume ...
- js控制滚动条默认在底部
html: <div id="chat_content" class="chat_content"> < ...
随机推荐
- Batch Normalization原理
Batch Normalization导读 博客转载自:https://blog.csdn.net/malefactor/article/details/51476961 作者: 张俊林 为什么深度神 ...
- [BZOJ 4818] [SDOI 2017] 序列计数
Description Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数. Alice还希望,这 \(n ...
- mysql表加锁、全表加锁、查看加锁、解锁
单个表锁定: 格式: LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},……] 例子: lock tables db_a.tb ...
- CodeForces 70
题目 A题 #include<bits/stdc++.h> using namespace std; int n,b,sum; int main(){ scanf("%d&quo ...
- iOS开发者知识普及,Swift 挑战 Objective-C,谁会笑到最后?
前言: 目前全球共有超过 7 亿台 iPhone 处于活跃状态,全球约有2000万名 iOS 开发者,这造就了 iOS 作为全球第二大移动设备平台的状态. 虽然安卓系统的全球市场占有率超过 iOS 系 ...
- Vue(基础八)_导航守卫(组件内的守卫)
一.前言 主要通过一个例子演示三个钩子的作用: 1.beforeRouteEnter() ...
- 收藏这些Safari快捷键,让你的Mac浏览网页更加方便
文章内容及图片来源于:知乎,如果涉及版权问题,请联系作者删除 文章收录于:风云社区(提供上千款各类mac软件的下载) Safari是Mac上的原生浏览器,功能自然很强大,现在每天在Mac上使用的最多的 ...
- IIS版本号可以被识别 解决方案
1.在IIS配置文件中进行修改. 借助IIS URL Rewrite Module,添加如下的重写规则: <rewrite> <allowedServerVariables> ...
- 轴对称 Navier-Stokes 方程组的点态正则性准则 I
在 [Lei, Zhen; Zhang, Qi. Criticality of the axially symmetric Navier-Stokes equations. Pacific J. Ma ...
- Groovy 设计模式 -- 保镖模式
Bouncer Pattern http://groovy-lang.org/design-patterns.html#_bouncer_pattern 保镖模式主要负责对函数的输入参数的合法性检查, ...