selenium
能够模拟批量获取页面下所有内容:(这是个特别强的工具,几乎就是模拟真人爬虫…,缺点就是会真的操控你的浏览器打开,效率低)
基本使用
导入selenium
模块,使用里面的webdriver
类,需要下载一个浏览器驱动并放在python目录下,这里下载的是chromedriver
:http://chromedriver.storage.googleapis.com/index.html?path=2.26/
要看对应版本:
https://blog.csdn.net/huilan_same/article/details/51896672
然后再将chrome的地址环境变量加入到path
中
WebDriver
控制整个浏览器用的
实例
from selenium import webdriver
browser = webdriver.Chrome() #用chrome内核打开浏览器,同理如果要火狐的就Firefox()
browser.get("http://www.baidu.com") #会以前面的浏览器内核打开该网址
browser.get_screenshot_as_file('mmm.jpg') #将当前浏览的页面保存到本地
print(browser.page_source) #打印源代码
browser.close() #关闭浏览器
常用方法
上面的browser
控制整个chrome,所以他是webdriver
,而get()
、close()
这些控制浏览器的就是webdriver的方法,其常用的方法还有:
`
(1)browser.page_source:获取当前页面源代码
(2)browser.curren_url:获取当前加载页面的 URL
(3)browser.close():关闭当前窗口, 如果当前窗口是最后一个窗口, 浏览器将关闭
(4)browser.quit():关闭所有窗口并停止 ChromeDriver 的执行
(5)browser.add_cookie(cookie_dict) :为当前会话添加 cookie ,举例:
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
(6)browser.get_cookie(name) :得到执行 cookie
(7)browser.get_cookies():得到所有的 cookie
(8)browser.delete_all_cookies():删除当前会话的所有cookie
(9)browser.delete_cookie(name) :删除指定 cookie
(10)browser.back():相当于浏览器的后退历史记录
(11)browser.forward():相当于浏览器的前进历史记录
(12)browser.execute_script(script, *args) :同步执行 js 脚本,举例:
browser.execute_script('alert("a")'),结果会弹出一个a的弹窗
(13)browser.execute_async_script(script, *args) :异步执行 js 脚本
(14)browser.get(url) :在当前窗口加载 url
(15)browser.refresh():刷新当前页面
(16)browser.switch_to.frame() :转到页面的某个frame里
(17)browser.switch_to.parent_frame() :返回父类的frame
(18)browser.current_window_handle:当前窗口的 handle, 相当于一个指针一样的东西, 用来指向当前窗口
(19)browser.window_handles : 当前浏览器中的已经打开的所有窗口, 是一个 list
(20)browser.switch_to_window(window_handle) : 切换 window_handle 指向的窗口
(21)browser.title : 当前页面的 title
(22)browser.name : 当前浏览器的名字
WebElement
用于定位标签,自动打开浏览器后我们可以定位标签,然后对该标签进行操作,常用定位标签方式如下:
find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector() #获取多个元素,id前面加#,class前面加.,多个之间用空格隔开
注:
如果要定位一组标签的话,就在element
后面加s
,比如:find_elements_by_id()
,获取标签后就可以对该标签进行操作了,比如某网页一个标签点击后会进入下个界面,举例:
a = browser.find_element_by_id("j-nav-catebtn") #获取该标签
print(a.text) #输出标签的文本内容
b = a.click() #点击该标签
time.sleep(5) #给你5秒钟观赏一下
上面的a就是定位的一个标签(是网易云课堂的一个标签,点击会进入首页),也就是webelement
,click()
是其的一个方法,还有其他很多常用方法。
常用的方法
clear() : 清楚元素的内容, 假如这个元素是一个文本元素
click() : 点击当前元素
is_displayed() : 当前元素是否可见
is_enabled() : 当前元素是否禁止, 比如经常会禁用一些元素的点击
is_selected() : 当前元素是否选中, 文本输入框的内容
send_keys(*value) : 向当前元素模拟键盘事件,输入内容
get_attribute(name) : 获取元素属性,比如该标签的class是什么
submit() : 提交表单
id :标签的id
location :标签在页面中的位置(x,y坐标)
size :标签尺寸大小
rect :把location和size结合起来
tag_name : 当前元素的标签名
text : 当前元素的内容
往网页标签传值
比如像登录操作时我们一般可以通过先定位标签,然后用send_keys()
往标签传值(有时如果里面有值就通过clear()
清空先),举例(这里测试的是一个自己随便写的网站):
a = browser.find_element_by_name("name") #索引到帐号部分
b = browser.find_element_by_name("password")
a.send_keys("aaa") #输入帐号
b.send_keys("111")
c = browser.find_elements_by_tag_name("input")
#因为submit标签没有设置name和id,而整个网页里这是第三个标签
#所以先定位一组input,到时候点击第三个就行了
c[2].click()
上面的最后提交数据还可以定位表单然后提交,比如上面那个网页就一个表单,所以把最后两行改成:
c = browser.find_element_by_tag_name("form")
c.submit()
这里还对一个测打字速度的网页写了个自动化脚本测试极限速度,代码如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://10fastfingers.com/typing-test/simplified-chinese")
c = browser.find_element_by_id("inputfield")
try:
while True:
a = browser.find_element_by_class_name("highlight")
b = str(a.text)
if b:
c.send_keys(b + " ")
else:
break
except:
pass
更多参考
https://www.cnblogs.com/zhaof/p/6953241.html
https://www.cnblogs.com/hanxiaobei/p/6108677.html
selenium使用注意
使用selenium访问网站并不是检测不出来,其有以下启动特征可以被检测到:
http://www.python66.com/seleniumjiaocheng/181.html
selenium存在的问题如下:
http://www.python66.com/seleniumjiaocheng/156.html
phantomjs
这个是无头浏览器,其也可以像前面那样自动化测试,但是没有界面,所以效率也会高一些,然后也可以解析js文件。
配置
1.下载地址:
http://phantomjs.org/download.html
2.配置:将其.exe
的路径加入到path
中,到命令行输入phantomjs
如果进入shell就说明配置成功
解析js:cmd切换到js文件目录下,输入:phantomjs xxx.js
就行了
使用
其使用方法和前面selenium几乎一样,导包也是from selenium import webdriver
,然后browser = webdriver.Chrome()
把Chrome
改成PhantomJS
就行了,然后可以设置窗口大小:set_window_size
,而且他比selenium有个地方好就是官网有对应api,让你设置比如是否加载图片,选择不加载可以提升速度,api网址:
http://phantomjs.org/api/
找到命令行的,然后把对应的配置到service_args
参数里即可,举例:
from selenium import webdriver
url = 'http://www.baidu.com'
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true'] #api中设置不加载图片,开启缓存
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS) #传入api参数,如果不传括号里空就好了
# browser.set_window_size(1400, 900) #设置窗口大小,也可以不设置
browser.get(url)
print(browser.page_source)
browser.close()
pyexecjs
也是解析js用的,需要pip
安装后,import execjs
使用举例
>>> execjs.eval("'red yellow blue'.split(' ')") #eval将代码还原原本意思
['red', 'yellow', 'blue']
>>> ctx = execjs.compile("""
function add(x, y) {
return x + y;
}
""")
#将js代码放入里面编译,也可以将js代码放入别的文件,然后在py下读取后放入这里面
>>> ctx.call("add", 1, 2) #call里面是要调用的函数名和传入的参数
3
>>> ctx = execjs.compile("""
add = (x, y) => x + y;
y = function(x){return x.toString()}
""")
>>> ctx.eval("y(add)")
# 可以看到在该编译环境下,所有的内容都在同一个context里
'(x, y) => x + y'
注:
如果上面es6的代码无法执行,说明可能没有配置node环境,那么首先需要安装node,然后配置环境如下:
os.environ["EXECJS_RUNTIME"] = "Node"
切换成普通JS环境:
jscript = execjs.get(execjs.runtime_names.JScript)
print(jscript.name)
jscript.eval("1 + 2")
更多参考
通过pyexecjs实现google翻译:
https://blog.csdn.net/yingshukun/article/details/53470424
js2py
也是解析JS用,个人认为这个模块十分好用,pip install js2py
eval_js()
执行单个js语句,举例:
>>> js2py.eval_js('a=1;a+1')
2
EvalJs
执行js函数,举例:
调用执行代码:
>>> import js2py
>>> context = js2py.EvalJs()
>>> fun_js = """function aaa(a) {
b = a + 1;
return b
}"""
>>> data_js = "let x = 1"
>>> context.execute(fun_js)
# 执行fun_js代码
>>> context.execute(data_js)
>>> context.aaa(context.x)
2
# 执行aaa()函数,并传入参数x
这里提供一个利用该模块实现的js逆向案例:https://blog.csdn.net/guodejie/article/details/81436556
更多参考
https://www.seoxiehui.cn/article-38590-1.html