python爬虫(三)
webdriver
Selenium是ThroughtWorks公司开发的一套Web自动化测试工具。
它分为三个组件:Selenium IDE,Selenium RC (Remote Control),Selenium Webdriver。
Selenium IDE是firefox的一个插件,允许测试人员录制脚本并回放。
Selenium RC和Selenium Webdriver是测试框架,提供多种语言的API。不同的是,Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。以及,Selenium Webdriver不需要本地服务器。
Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。主要是来解决https的加密问题。
Webdriver在使用之前,需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:
Google的我推荐给大家一个百度地址:
链接:https://pan.baidu.com/s/1qZ2LfmW 密码:qixa
下载以后,并把chromdriver放在google.exe那个当前目录下面。
import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
#print(os.environ)
os.environ["webdriver.chrome.driver"] = chromedriver # 把chromedriver.exe的路径加入环境变量中
driver = webdriver.Chrome(chromedriver) # 启动谷歌浏览器
driver.get("http://www.python.org") # 用浏览器打开该网址
driver.quit()
结果如下图:

八种选择器
1. find_elements_by_name("test")
假如有如下一个页面:
<input type="text" name="passwd" id="passwd-id" class="input-class"/>
代码:
element = driver.find_elements_by_name("passwd")
2. find_elements_by_id()
element = driver.find_element_by_id("passwd-id")
find_element_by_tagname
element = driver.find_element_by_tagname("input")
3. find_element_by_class_name("input-class")
4. find_elements_by_tag_name("iframe")
DOM的Tag元素
用Tag name 定位元素的例子:
<iframe src="..."></iframe>
element = driver.find_elements_by_tag_name("iframe")
5. find_element_by_link_text()
页面:
<a href="http://www.google.com/search?q=baidu">baidu</a>
代码:
element = browser.find_elements_by_link_text("baidu")
6.xpath 这个特别强大,所有的元素都可以通过这个可以找到。
XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
绝对路径: 根元素开始,即html开始用/
相对路劲: 任意符合条件的元素 //
查找页面上所有的input元素://input
查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
查找页面上第一个form元素://form[1]
查找页面上id为loginForm的form元素://form[@id='loginForm']
查找页面上具有name属性为username的input元素://input[@name='username']
查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]
查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]
控件操作
输入框
element.clear() 清空输入框数据
element.sendkeys("username") 发送数据
element.text 获取文本的值
按钮
element.click()
表单提交
element.submit()
单选和多选框
element.clear()
element = browser.find_elements_by_id("checkbox")
选择某个单选项
element.click()
常用方法
browser.get_cookies()
browser.title # 头名字
browser.close()
browser.forward() # 前进
browser.back() # 后退
browser.refresh() # 刷新
browser.current_url # 返回当前页面
登录12306
from selenium import webdriver
import random
import time def randomSleep(minS, maxS):
time.sleep((maxS - minS) * random.random() + minS)
browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe") # chromedriver.exe存放路径
url = "https://kyfw.12306.cn/otn/login/init" # 要登录的网址 browser.get(url=url)
print(browser.find_element_by_id("username").text)
browser.find_element_by_id("username").clear() # 清空输入框数据
browser.find_element_by_id("username").send_keys("974644081@qq.com") # 发送用户名到输入框
randomSleep(2, 5)
browser.find_element_by_id("password").send_keys("xxxxxxxxx") # 发送密码到输入框
randomSleep(1, 4)
time.sleep(6)
browser.find_element_by_id("loginSub").click() # 点击登录按钮
randomSleep(2, 5)
print(browser.get_cookies())
browser.quit()
登录京东
from selenium import webdriver
import random
import time def randomSleep(minS, maxS):
time.sleep((maxS - minS) * random.random() + minS)
browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe") # chromedriver.exe存放路径
# browser = webdriver.Chrome() browser.get("https://passport.jd.com/new/login.aspx") # 要登录的网址 # Login by username and password
randomSleep(1, 2)
browser.find_element_by_xpath("//a[@clstag='pageclick|keycount|201607144|2']").click()
# browser.find_element_by_tag_name("pageclick|keycount|201607144|2").click() # Username and password
randomSleep(1, 2)
browser.find_element_by_id("loginname").send_keys("xxxxxxx") # 发送登录用户名
print(browser.find_element_by_id("loginname").text) randomSleep(1, 3)
browser.find_element_by_id("nloginpwd").send_keys("xxxxxx") # 发送登录密码 # Submit, wait for a long time
randomSleep(5, 10)
browser.find_element_by_id("loginsubmit").click() # 点击登录提交按钮
print(browser.get_cookies())
randomSleep(3, 5)
browser.quit()
python爬虫(三)的更多相关文章
- Python爬虫(三)爬淘宝MM图片
直接上代码: # python2 # -*- coding: utf-8 -*- import urllib2 import re import string import os import shu ...
- python爬虫(三)
Requests模块 这个库的标准文档有个极其幽默的地方就是它的中文翻译,我就截取个开头部分,如下图: 是不是很搞笑,在正文中还有许多,管中窥豹,可见一斑.通过我的使用,感觉Requests库的确是给 ...
- Python 爬虫三 beautifulsoup模块
beautifulsoup模块 BeautifulSoup模块 BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查 ...
- Python爬虫(三)——开封市58同城出租房决策树构建
决策树框架: # coding=utf-8 import matplotlib.pyplot as plt decisionNode = dict(boxstyle=') leafNode = dic ...
- Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析
文化 经管 ....略 结论: 一个模块的评分与评论数相关,评分为 [8.8——9.2] 之间的书籍评论数往往是模块中最多的
- Python 爬虫 (三)
#对第一章的百度翻译封装的函数进行更新 1 from urllib import request, parse from urllib.error import HTTPError, URLError ...
- Python爬虫(四)——开封市58同城数据模型训练与检测
前文参考: Python爬虫(一)——开封市58同城租房信息 Python爬虫(二)——对开封市58同城出租房数据进行分析 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 ...
- Python爬虫(四)——豆瓣数据模型训练与检测
前文参考: Python爬虫(一)——豆瓣下图书信息 Python爬虫(二)——豆瓣图书决策树构建 Python爬虫(三)——对豆瓣图书各模块评论数与评分图形化分析 数据的构建 在这张表中我们可以发现 ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- 3.Python爬虫入门三之Urllib和Urllib2库的基本使用
1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器解释才呈现出来的,实质它是一段HTML代码,加 JS.CSS ...
随机推荐
- PHP初级程序员出路
分销系统 微信公众号开发 分销系统 微信小程序
- Docker配置阿里云加速地址
首先需要注册一个阿里云账号,只要注册账号就可以,不用充钱购买任何阿里云服务! 打开阿里云网站https://cr.console.aliyun.com,登陆自己的阿里云账号. 然后只需要在服务器配置d ...
- http协议、cookie及session
1. HTTP协议是无连接的 网页操作--浏览器--Http协议--web服务器(appache/IIS) 无连接的 每次连接只处理一个请求,服务器处理完并收到客户端应答,即断开连接 目的:节省传输时 ...
- C++标准模板库STL
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码 ...
- WCF、WebAPI、WCFREST、WebService之间的区别总结(实用)
在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对 ...
- Jquery/js引入的button的onclik事件只触发一次
目标描述 我要实现的是:通过监听button的click事件,从而通过ajax向servlet发送请求获取数据库中的数据,然后返回的页面,并要求局部刷新 一次页面的加载是html直接页面初始化本身的 ...
- Java - "JUC线程池" ThreadPoolExecutor原理解析
Java多线程系列--“JUC线程池”02之 线程池原理(一) ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存 ...
- Spring全家桶系列–[SpringBoot入门到跑路]
//本文作者:cuifuan Spring全家桶————[SpringBoot入门到跑路] 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻,这也是为什么 ...
- 获取物化视图定义语句的SQL
老系统里总有人用物化视图,然后新同事们就得去FixBug 然后就遇到怎么查看物化视图定义语句的问题了 分享下,祝顺利! DBA权限下执行: select dbms_metadata.get_ddl(' ...
- JS中深浅拷贝 函数封装代码
一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...