色胃康胶囊 发表于 2018-8-7 09:35:08

55. Python 爬虫(4)

  webdriver
  Selenium是ThroughtWorks公司开发的一套Web自动化测试工具。
  它分为三个组件:
Selenium IDE  
Selenium RC (Remote Control)
  
Selenium Webdriver

  Selenium>  Selenium RC和Selenium Webdriver:是测试框架,提供多种语言的API。
  不同的是,Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。而且,Selenium Webdriver不需要本地服务器。
  Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。
  主要是来解决https的加密问题
  Webdriver在使用之前,需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:
  百度搜:

  进入网站:
  http://npm.taobao.org/mirrors/chromedriver/

  下载以后,并把chromdriver放在chrome的google.exe的目录下面

  先安装selenium
# pip install selenium  自动打开chrome,并打开域名相关的网页
import os  
import time
  
from selenium import webdriver
  
from selenium.webdriver.common.keys import Keys
  
chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
  
os.environ["webdriver.chrome.driver"] = chromedriver
  
driver = webdriver.Chrome(chromedriver)
  
driver.get("http://www.python.org")
  
time.sleep(100)
  
driver.quit()
  执行:自动打开网页

  搜索栏(Search)的代码如下:

  id="id-search-field" 是 Search 的唯一标识符。

  id="submit" 是按钮“GO”的唯一标识符。
  让页面自动搜索关键字,代码如下:
import os  
import time
  
from selenium import webdriver
  
from selenium.webdriver.common.keys import Keys
  
chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
  
os.environ["webdriver.chrome.driver"] = chromedriver
  
driver = webdriver.Chrome(chromedriver)
  
driver.get("http://www.python.org")
  
element = driver.find_element_by_id("id-search-field")
  
element.clear()
  
element.send_keys("os")
  
elementsubmit = driver.find_element_by_id("submit")
  
elementsubmit.click()
  
time.sleep(10000)
  
driver.quit()
  结果如图:

  学习几种选择器:
  1. find_elements_by_name(“test”)   # 根据name定位
  页面:

  <input type=&quot;text&quot; name=&quot;passwd&quot;>  代码:
  element = driver.find_elements_by_name(“passwd”)
  2. find_elements_by_id()#根据ID定位,定位最准确
  element = driver.find_element_by_id(“passwd-id”)
  By.tagname()
  element = driver.find_element_by_tag_name(“input”)
  3. find_element_by_class_name(‘input-class’)   #根绝class定位
  4. find_elements_by_tag_name(‘iframe’)#根据元素定位
  这里以iframe举例:用Tag name 定位元素
  例子:
  检查页面获得如下:
  <iframe src=&quot;... ...&quot;> xxxxxxx </iframe>
  element = driver.find_elements_by_tag_name(&quot;iframe&quot;)
  【iframe 就是定位行的元素】
  5. find_element_by_link_text()#通过链接文字定位
  页面:
  <a href=&quot;http://www.google.com/search?q=baidu&quot;>baidu</a>
  代码:
  element = browser.find_elements_by_link_text(&quot;baidu&quot;)
  6. xpath
  这个特别强大,所有的元素都可以通过这个可以找到。
  XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
绝对路径: 根元素开始,及html开始用/  
相对路劲: 任意符合条件的元素 //
  
查找页面上所有的input元素://input
  
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form/input
  
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form//input
  
查找页面上第一个form元素://form
  
查找页面上id为loginForm的form元素://form[@id='loginForm']
  
查找页面上具有name属性为username的input元素://input[@name='username']
  
查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input
  
查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
  
查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input
  控件操作:
  输入框;
  element.clear()#清空输入框数据
  element.sendkeys(“username”)   #发送数据
  element.text         #获取元素文本的值
  按钮:
  element.click()#&quot;点击&quot;操作
  element.submit()#同.click(),操作相同,常用 .click()
  单选和多选框
  element.clear()
  element = browser.find_elements_by_id(' checkbox')#也可能是其他,根据具体情况,选择关键字元素即可。
  ##选择某个单选项:
  element.click();
  常用方法:
  browser.get_cookies()
  browser.title   #头名字
  browser.close()
  .forward() #前进
  举例:
  browser.foeward()
  .back() #后退
  举例:
  browser.back()
  .refresh()#刷新
  举例:
  browser.refresh()
  .current_url#返回当前页面url
  举例:
  browser.current_url
  实例1:登录12306
from selenium import webdriver  
import random
  
import time
  

  
def randomSleep(minS, maxS):
  
    time.sleep((maxS - minS) * random.random() + minS)
  

  
browser = webdriver.Chrome(r&quot;C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe&quot;)
  
url = &quot;https://kyfw.12306.cn/otn/login/init&quot;
  
browser.get(url=url)
  
print(browser.find_element_by_id(&quot;username&quot;).text)
  
browser.find_element_by_id(&quot;username&quot;).clear()
  
browser.find_element_by_id(&quot;username&quot;).send_keys(&quot;xxxxxxxxxx&quot;)
  
randomSleep(2, 5)
  
browser.find_element_by_id(&quot;password&quot;).send_keys(&quot;xxxxxxxxx&quot;)
  
randomSleep(1, 4)
  
time.sleep(6)
  
browser.find_element_by_id(&quot;loginSub&quot;).click()
  
randomSleep(2, 5)
  
print(browser.get_cookies())
  
browser.quit()
  #除验证码要手动确认外,其他全自动完成。
  实例2:登录京东(重点在xpath选择器的用法)
from selenium import webdriver  
import random
  
import time
  

  
def randomSleep(minS, maxS):
  
    time.sleep((maxS - minS) * random.random() + minS)
  

  
browser = webdriver.Chrome(r&quot;C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe&quot;)
  
# Home
  
browser.get(&quot;https://passport.jd.com/new/login.aspx&quot;)
  
# Login by username and password
  
randomSleep(1, 2)
  
browser.find_element_by_xpath(&quot;//a[@clstag='pageclick|keycount|201607144|2']&quot;).click()
  
# Username and password
  
randomSleep(1, 2)
  
browser.find_element_by_id(&quot;loginname&quot;).send_keys(&quot;xxxxxxxx&quot;)#用户
  
print(browser.find_element_by_id(&quot;loginname&quot;).text)
  
randomSleep(1, 3)
  
browser.find_element_by_id(&quot;nloginpwd&quot;).send_keys(&quot;xxxxxxx&quot;)#密码
  
# Submit, wait for a long time
  
randomSleep(5, 10)
  
browser.find_element_by_id(&quot;loginsubmit&quot;).click()
  
print(browser.get_cookies())
  
randomSleep(3, 5)
  
browser.quit()
页: [1]
查看完整版本: 55. Python 爬虫(4)