原文: http://106.13.73.98/__/137/
__安装:pip install selenium__![在这里插入图片描述](http://106.13.73.98/media/ai/2019-03/043e4430-eff5-482a-8cde-35db4c8d8d25.gif)
> __补充:__
>
>
> 常用的 find_element 系列函数:
> - find_element_by_id 根据 id 找节点
> - find_element_by_name 根据 name 找节点
> - find_element_by_xpath 根据 xpath 找节点
> - find_element_by_tag_name 根据 标签 找节点
> - find_element_by_class_name 根据 class 找节点
>
>
> 其他:
> - get_cookies() 获取cookies,比如操作浏览器登录后获取cookies,然后进行其它操作
> - page_source 返回字符串类型的页面内容
`selenium`对外提供的接口可以操作浏览器,然后让浏览器去完成自动化的操作。
使用`selenium`的前提是,你的电脑得有浏览器和该浏览器版本对应的驱动版本。
我们一般使用谷歌或者PhantomJS浏览器,本文将使用谷歌浏览器。
__请根据你的谷歌浏览器版本,下载对应的驱动文件__
- 谷歌浏览器版本与驱动版本的对应关系:https://blog.csdn.net/huilan_same/article/details/51896672
- 谷歌浏览器驱动下载地址:http://chromedriver.storage.googleapis.com/index.html
- 常用谷歌浏览器V69-71版本的驱动下载:https://download.csdn.net/download/qq_41964425/10908837
__案例:使用selenium操作谷歌浏览器登录QQ空间并获取好友动态页面内容__
```python
import time
from selenium import webdriver # 创建浏览器的对象,通过该对象可以操作浏览器
from lxml import etree
# 你也可以这样使用,来实现谷歌无头浏览器(就是让其在后台运行),固定写法:
# from selenium.webdriver.chrome.options import Options
# chrome_options = Options()
# chrome_options.add_argument(‘--headless‘)
# chrome_options.add_argument(‘--disable-gpu‘)
# bro = webdriver.Chrome(executable_path=r‘.\chromedriver.exe‘, chrome_options=chrome_options)
bro = webdriver.Chrome(executable_path=r‘.\chromedriver.exe‘)
# executable_path:指定谷歌浏览器驱动文件路径,请先下载驱动
# 向QQ空间登录页面发送请求
bro.get(url=‘https://i.qq.com/‘)
time.sleep(1)
# 定位到指定的iframe
bro.switch_to.frame(‘login_frame‘)
# 因为QQ空间登录页面是多个页面合成的,因此我们要定位到要操作的页面上
# 这里我们定位的iframe就是填写QQ账号密码的那个小框框
# 点击账号密码登录
bro.find_element_by_id(‘switcher_plogin‘).click()
time.sleep(1)
# 填写账号密码
bro.find_element_by_id(‘u‘).send_keys(‘请使用你自己的QQ账号‘) # send_keys() 用于向标签内录入数据
time.sleep(1)
bro.find_element_by_id(‘p‘).send_keys(‘请使用你自己的QQ密码‘)
time.sleep(1)
# 点击登录按钮
bro.find_element_by_id(‘login_button‘).click()
time.sleep(1)
# 如果你的浏览器也出现提示让你安装flash插件,请打开此注释
# bro.find_element_by_id(‘QZ_Body‘).click()
# 点击个人中心
bro.find_element_by_id(‘aIcenter‘).click()
time.sleep(1)
# 把网页往下拉(用于获取更多好友动态信息),连拉3次
js = ‘window.scrollTo(0, document.body.scrollHeight)‘
bro.execute_script(js)
time.sleep(1)
bro.execute_script(js)
time.sleep(1)
bro.execute_script(js)
# 获取好友页面源码
page_text = bro.page_source
# 注意:这里获取页面源码是非阻塞的,因此这一步骤的暂定等待是有必要的
time.sleep(3)
# 开始解析获取好友动态
tree = etree.HTML(page_text)
div_list = tree.xpath(‘//div[@class="f-info qz_info_cut"] | //div[@class="f-info"]‘)
# 打印获取到的好友动态内容
for div in div_list:
text = div.xpath(‘.//text()‘)
text = ‘‘.join(text)
print(text)
# 关闭浏览器
bro.quit()
```
__关于 PhantomJS 浏览器__
PhantomJS浏览器下载:https://download.csdn.net/download/qq_41964425/10909314
`PhantomJS`是一款无界面的浏览器,其自动化的操作流程和上述操作谷歌浏览器是一致的。
由于`PhantomJS`是无界面的,为了能够展示自动化操作流程,它还为我们提供了一个截屏功能,使用`save_screenshot`函数来实现。
`selenium+phantomjs`就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法获取动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。
截屏功能的简单示例:
```python
from selenium import webdriver # 创建浏览器的对象,通过该对象可以操作浏览器
path = r‘.\phantomjs-2.1.1-windows\bin\phantomjs.exe‘
browser = webdriver.PhantomJS(executable_path=path)
# executable_path:指定PhantomJS浏览器的.exe文件
# 向百度页面发送请求
browser.get(url=‘https://www.baidu.com/‘)
# 开始截屏
browser.save_screenshot(‘截屏文件.jpg‘) # !!
# 退出浏览器
browser.quit()
```
但由于`PhantomJS`最近已经停止了更新和维护,所以推荐大家可以使用`谷歌无头浏览器`,是一款无界面的谷歌浏览器,其用法在上述的案例中有讲解。
> __关于谷歌浏览器弹窗问题的解决方案__
>
>
> ![在这里插入图片描述](http://106.13.73.98/media/ai/2019-03/053c89ee-55b2-4dc8-a46a-c4167469e5d9.png)
> 如上图,我们使用下面的配置,可以禁止它弹出来:
> ```python
> from selenium import webdriver # pip install selenium
>
> options = webdriver.ChromeOptions()
> prefs = {‘profile.default_content_setting_values‘ :{‘notifications‘: 2}}
> options.add_experimental_option(‘prefs‘, prefs)
> bro = webdriver.Chrome(chrome_options=options, executable_path=‘你的谷歌浏览器驱动路径‘)
> ```
> __补充:获取 Cookies 字典__
> ```python
> for cookie in bro.get_cookies():
> cookies[cookie[‘name‘]] = cookie[‘value‘]
> ```
原文: http://106.13.73.98/__/137/【Python selenium】 -- 2019-08-12 12:41:46
原文:https://www.cnblogs.com/agsaa/p/11339034.html