详细使用链接: 点击链接

selenium介绍:

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题

selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种常见的浏览器

from selenium import webdriver
browser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.PhantomJS()
browser=webdriver.Safari()
browser=webdriver.Edge()

官网:http://selenium-python.readthedocs.io

环境搭建

1.在python中使用selenium需要先安装对应的模块

pip install selenium

2.selenium的原理是操作驱动浏览器来完成对目标页面的请求与渲染,所以需要下载对应的浏览器驱动程序,推荐使用chrome

镜像地址:https://npm.taobao.org/mirrors/chromedriver/

需要注意的是,驱动程序版本需要与浏览器版本对应,你可以打开chrome的关于浏览器查看到具体版本。

驱动与浏览器的版本对应关系

ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72 ChromeDriver v2.44 (2018-11-19)----------Supports Chrome v69-71 ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71 ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70 ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69 ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68 ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68 ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67 ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66 ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65 ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64

在无GUI系统下的使用方法

如果你的操作系统没有GUI(图形界面),则需要使用无界面的浏览器来搭配selenium使用,有两种方案可选

1.使用phantomJS

#安装:selenium+phantomjs
#pip3 install selenium
#下载phantomjs,解压后把phantomjs.exe放在项目目录中或是添加到系统环境变量中
#下载链接:http://phantomjs.org/download.html
from selenium import webdriver
driver=webdriver.PhantomJS() #无界面浏览器
driver.get('https://www.baidu.com')
driver.page_source
driver.close() #关闭浏览器,回收资源

目前phantomJS已经停止了更新维护,幸好Chrome 出来救场了, 是的selenium再次成为了反爬虫 Team 的噩梦

自Google 发布 chrome 59 / 60 正式版 开始便支持Headless mode

这意味着在无 GUI 环境下, PhantomJS 不再是唯一选择

2.使用chrome并设置为无GUI模式

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 可以提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统如果无界面不加这条会启动失败

driver=webdriver.Chrome("驱动绝对路径 如果环境变量中有则可以不写",chrome_options=chrome_options)
driver.get('https://www.baidu.com')
print('hao123' in driver.page_source)
driver.close() #切记关闭浏览器,回收资源
#selenium+谷歌浏览器headless模式

基本使用

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
try:
   browser.get('https://www.baidu.com')

   input_tag=browser.find_element_by_id('kw')
   input_tag.send_keys('美女') #python2中输入中文错误,字符串前加个u
   input_tag.send_keys(Keys.ENTER) #输入回车

   wait=WebDriverWait(browser,10)
   wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等到id为content_left的元素加载完毕,最多等10秒
   
   print(browser.page_source)
   print(browser.current_url)
   print(browser.get_cookies())

finally:
   browser.close()

查找元素

#官网链接:http://selenium-python.readthedocs.io/locating-elements.html
from selenium import webdriver
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
import time

driver=webdriver.Chrome()
driver.get('https://www.baidu.com')
wait=WebDriverWait(driver,10)

try:
   #===============所有方法===================
   # 1、find_element_by_id
   # 2、find_element_by_link_text
   # 3、find_element_by_partial_link_text
   # 4、find_element_by_tag_name
   # 5、find_element_by_class_name
   # 6、find_element_by_name
   # 7、find_element_by_css_selector
   # 8、find_element_by_xpath
   # 强调:
   # 1、上述均可以改写成find_element(By.ID,'kw')的形式
   # 2、find_elements_by_xxx的形式是查找到多个元素,结果为列表

   #===============示范用法===================
   # 1、find_element_by_id
   print(driver.find_element_by_id('kw'))

   # 2、find_element_by_link_text
   # login=driver.find_element_by_link_text('登录')
   # login.click()

   # 3、find_element_by_partial_link_text
   login=driver.find_elements_by_partial_link_text('录')[0]
   login.click()

   # 4、find_element_by_tag_name
   print(driver.find_element_by_tag_name('a'))

   # 5、find_element_by_class_name
   button=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))
   button.click()

   # 6、find_element_by_name
   input_user=wait.until(EC.presence_of_element_located((By.NAME,'userName')))
   input_pwd=wait.until(EC.presence_of_element_located((By.NAME,'password')))
   commit=wait.until(EC.element_to_be_clickable((By.ID,'TANGRAM__PSP_10__submit')))

   input_user.send_keys('18611453110')
   input_pwd.send_keys('xxxxxx')
   commit.click()

   # 7、find_element_by_css_selector
   driver.find_element_by_css_selector('#kw')

   # 8、find_element_by_xpath

   time.sleep(5)

finally:
   driver.close()

获取标签属性

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
browser.get('https://www.amazon.cn/')

wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'cc-lm-tcgShowImgContainer')))

tag=browser.find_element(By.CSS_SELECTOR,'#cc-lm-tcgShowImgContainer img')

#获取标签属性,
print(tag.get_attribute('src'))
#获取标签ID,位置,名称,大小(了解)
print(tag.id)
print(tag.location)
print(tag.tag_name)
print(tag.size)

browser.close()

等待元素加载

#1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待

#2、等待的方式分两种:
隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
显式等待:在browser.get('xxx')之后设置,只针对某个元素有效

隐式等待

每次都会等待网页全部加载完成再进行下一步

from selenium import webdriver
browser=webdriver.Chrome()

#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10)

browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
print(contents)

browser.close()

显式等待

明确的指定要等待哪一个元素出现

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

#显式等待:显式地等待某个元素被加载
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))

contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents)

browser.close()

交互操作

清空输入框

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
browser.get('https://www.amazon.cn/')
wait=WebDriverWait(browser,10)

input_tag=wait.until(EC.presence_of_element_located((By.ID,'twotabsearchtextbox')))
input_tag.send_keys('iphone 8')
button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
button.click()

import time
time.sleep(3)

input_tag=browser.find_element_by_id('twotabsearchtextbox')
input_tag.clear() #清空输入框
input_tag.send_keys('iphone7plus') # 输入文字
button=browser.find_element_by_css_selector('#nav-search > form > div.nav-right > div > input')
button.click() # 点击按钮

切换fream

#frame相当于一个单独的网页,在父frame里是无法直接查看到子frame的元素的,必须switch_to_frame切到该frame下,才能进一步查找

from selenium import webdriver

try:
   browser=webdriver.Chrome()
   browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
   browser.switch_to.frame('iframeResult') #切换到id为iframeResult的frame
   tag1=browser.find_element_by_id('droppable')
   print(tag1)

   # tag2=browser.find_element_by_id('textareaCode') #报错,在子frame里无法查看到父frame的元素
   browser.switch_to.parent_frame() #切回父frame,就可以查找到了
   tag2=browser.find_element_by_id('textareaCode')
   print(tag2)

finally:
   browser.close()

动作链

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素

driver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
wait=WebDriverWait(driver,3)
try:
   driver.switch_to.frame('iframeResult') ##切换到iframeResult
   sourse=driver.find_element_by_id('draggable')
   target=driver.find_element_by_id('droppable')

   #方式一:基于同一个动作链串行执行
   # actions=ActionChains(driver) #拿到动作链对象
   # actions.drag_and_drop(sourse,target) #把动作放到动作链中 一次性移动到目标位置
   # actions.perform() # 执行

   #方式二:线性移动
   ActionChains(driver).click_and_hold(sourse).perform()
   distance=target.location['x']-sourse.location['x']

   track=0
   while track < distance:
       ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
       track+=2
   ActionChains(driver).release().perform()
finally:
   driver.close()

执行JS

在交互动作比较难实现的时候可以自己写JS

from selenium import webdriver
try:
   browser=webdriver.Chrome()
   browser.get('https://www.baidu.com')
   browser.execute_script('alert("hello world")') #打印警告
finally:
   browser.close()

前进后退

#模拟浏览器的前进后退
import time
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/')

browser.back()
time.sleep(4)
browser.forward()
browser.close()

选项卡切换

#选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:ctrl+t等,最通用的就是js的方式
import time
from selenium import webdriver

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')

print(browser.window_handles) #获取所有的选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(10)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()

xpath

xpath XML_Path是一种通用的查找元素方式,也在scrapy模块中使用

doc='''
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
  <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
  <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
  <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
  <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
  <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a>
</div>
</body>
</html>
'''
from lxml import etree

html=etree.HTML(doc)
# html=etree.parse('search.html',etree.HTMLParser())

#/一个斜杠表示子级标签
#//一个斜杠表示子孙标签

# 1 所有节点
# a=html.xpath('//*')
# 2 指定节点(结果为列表)
# a=html.xpath('//head')
# 3 子节点,子孙节点
# a=html.xpath('//div/a')
# a=html.xpath('//body/a') #无数据
# a=html.xpath('//body//a')
# 4 父节点
# a=html.xpath('//body//a[@href="image1.html"]/..')
# a=html.xpath('//body//a[1]/..')
# 也可以这样
# a=html.xpath('//body//a[1]/parent::*')
# 5 属性匹配
# a=html.xpath('//body//a[@href="image1.html"]')

# 6 文本获取
# a=html.xpath('//body//a[@href="image1.html"]/text()')

# 7 属性获取
# a=html.xpath('//body//a/@href')
# # 注意从1 开始取(不是从0)
# a=html.xpath('//body//a[1]/@href')
# 8 属性多值匹配
# a 标签有多个class类,直接匹配就不可以了,需要用contains
# a=html.xpath('//body//a[@class="li"]')
# a=html.xpath('//body//a[contains(@class,"li")]')
# a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
# a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
# a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
# # a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 10 按序选择
# a=html.xpath('//a[2]/text()')
# a=html.xpath('//a[2]/@href')
# 取最后一个
# a=html.xpath('//a[last()]/@href')
# 位置小于3的
# a=html.xpath('//a[position()<3]/@href')
# 倒数第二个
# a=html.xpath('//a[last()-2]/@href')
# 11 节点轴选择
# ancestor:祖先节点
# 使用了* 获取所有祖先节点
# a=html.xpath('//a/ancestor::*')
# # 获取祖先节点中的div
# a=html.xpath('//a/ancestor::div')
# attribute:属性值
# a=html.xpath('//a[1]/attribute::*')
# child:直接子节点
# a=html.xpath('//a[1]/child::*')
# descendant:所有子孙节点
# a=html.xpath('//a[6]/descendant::*')
# following:当前节点之后所有节点
# a=html.xpath('//a[1]/following::*')
# a=html.xpath('//a[1]/following::*[1]/@href')
# following-sibling:当前节点之后同级节点
# a=html.xpath('//a[1]/following-sibling::*')
# a=html.xpath('//a[1]/following-sibling::a')
# a=html.xpath('//a[1]/following-sibling::*[2]')
# a=html.xpath('//a[1]/following-sibling::*[2]/@href')

爬虫之selenium使用的更多相关文章

  1. [Python爬虫]使用Selenium操作浏览器订购火车票

    这个专题主要说的是Python在爬虫方面的应用,包括爬取和处理部分 [Python爬虫]使用Python爬取动态网页-腾讯动漫(Selenium) [Python爬虫]使用Python爬取静态网页-斗 ...

  2. 一起学爬虫——使用selenium和pyquery爬取京东商品列表

    layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...

  3. 爬虫系列---selenium详解

    一 安装 pip install Selenium 二 安装驱动 chrome驱动文件:点击下载chromedriver (yueyu下载) 三 配置chromedrive的路径(仅添加环境变量即可) ...

  4. Python 爬虫利器 Selenium 介绍

    Python 爬虫利器 Selenium 介绍 转 https://mp.weixin.qq.com/s/YJGjZkUejEos_yJ1ukp5kw 前面几节,我们学习了用 requests 构造页 ...

  5. Python爬虫之selenium的使用(八)

    Python爬虫之selenium的使用 一.简介 二.安装 三.使用 一.简介 Selenium 是自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏 ...

  6. Python爬虫之selenium高级功能

    Python爬虫之selenium高级功能 原文地址 表单操作 元素拖拽 页面切换 弹窗处理 表单操作 表单里面会有文本框.密码框.下拉框.登陆框等. 这些涉及与页面的交互,比如输入.删除.点击等. ...

  7. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  8. Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

  9. python爬虫利器Selenium使用详解

    简介: 用pyhon爬取动态页面时普通的urllib2无法实现,例如下面的京东首页,随着滚动条的下拉会加载新的内容,而urllib2就无法抓取这些内容,此时就需要今天的主角selenium. Sele ...

  10. Python爬虫小白---(二)爬虫基础--Selenium PhantomJS

    一.前言   前段时间尝试爬取了网易云音乐的歌曲,这次打算爬取QQ音乐的歌曲信息.网易云音乐歌曲列表是通过iframe展示的,可以借助Selenium获取到iframe的页面元素, 而QQ音乐采用的是 ...

随机推荐

  1. Xcode 5.0 编译低版本app

    Xcode 5.0 默认的编译环境是iOS7,编译出来的app,安装到iOS7.0版本以上的手机上,会表现出iOS7.0的风格.兼容不太好的应用,布局上可能会因此乱八七糟. 如果还不想让app升级到i ...

  2. jQuery-替换和删除元素

    1.replaceWith方法 用提供的内容替换集合中所有匹配的元素并且返回被替换元素的集合 参数类型说明: 1)普通字符串(可包含各种html标签) 2)jQuery对象 ①使用$函数创建的新元素( ...

  3. 解析oracle的rownum

    本人最近在使用oracle的rownum实现分页显示的时候,对rownum做了进一步的分析和研究.现归纳如下,希望能给大家带来收获. 对于rownum来说它是oracle系统顺序分配为从查询返回的行的 ...

  4. Tomcat源码学习

    Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...

  5. 基于Bootstrap使用jQuery实现输入框组input-group的添加与删除-改进版

    上一次说到了基于Bootstrap使用jQuery实现输入框组input-group的添加与删除 ,初始状态下只有一个输入框组,可以通过点击输入框组的右侧“+”(或自定义的文字)可以在原输入框组的下面 ...

  6. 怎么输入MathType不等号

    MathType是一款比较常用的数学公式编辑器,我们在使用这款软件的时候常常需要输入各种符号.有些新用户对这款软件不是很熟悉,对于一些符号不知道怎么输入,下面我们来给大家介绍介绍MathType不等号 ...

  7. COOKIE和SESSION关系和区别等

    一.cookie介绍 cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie.通过 PHP,您能够创建并取回 c ...

  8. linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中

    环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 内核版本:2.6.32-504.el6.x86_64 需求描述: 一 ...

  9. STL 源代码剖析 算法 stl_algo.h -- search_n

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search_n ------------------------------------- ...

  10. JavaScript------自定义string.replaceAll()方法

    代码:: 注意:原始的replace()方法只能替换第一个字符串check String.prototype.replaceAll = function (s1, s2) { return this. ...