【Python selenium】

妖精的绣舞 提交于 2019-11-28 17:47:22

原文: http://blog.gqylpy.com/gqy/362

安装:pip install selenium



补充:


常用的 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空间并获取好友动态页面内容

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内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。

截屏功能的简单示例:

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最近已经停止了更新和维护,所以推荐大家可以使用谷歌无头浏览器,是一款无界面的谷歌浏览器,其用法在上述的案例中有讲解。

关于谷歌浏览器弹窗问题的解决方案



如上图,我们使用下面的配置,可以禁止它弹出来:
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 字典

for cookie in bro.get_cookies():     cookies[cookie['name']] = cookie['value']

原文: http://blog.gqylpy.com/gqy/362

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!