第六天
selenium操作浏览器的方法selenium常用方法总结selenium中查找页面元素的方法用selenium+phantomjs来请页面的流程selenium的三种等待
selenium操作浏览器的方法
from selenium
import webdriver
driver
=webdriver
.Chrome
()
driver
.get
('http://www.baidu.com/')
html_str
=driver
.page_source
print(driver
.title
)
print(driver
.get_cookies
())
driver
.find_element_by_id
("kw").send_keys
(u
'爬虫')
driver
.find_element_by_id
('su').click
()
driver
.find_element_by_id
('su').click
()
webEle
= driver
.find_element_by_id
('kw')
driver
.find_element_by_id
('kw')
driver
.find_element_by_css_selector
('#kw')
driver
.find_element_by_xpath
('')
input=driver
.find_element_by_id
('kw')
print(input.location
)
print(input.size
)
selenium常用方法总结
请求url
driver
.get
('http://www.baidu.com/')
获取页面字符串 page_source
driver
.page_source
1.获取当前页面的Url
方法:current_url
实例:driver
.current_url
2.获取元素坐标
方法:location
解释:首先查找到你要获取元素的,然后调用location方法
实例:driver
.find_element_by_xpath
("xpath").location
3.表单的提交
方法:submit
解释
:查找到表单(
from)直接调用submit即可
实例:driver
.find_element_by_id
("form1").submit
()
4.获取CSS的属性值
方法:value_of_css_property
(css_name
)
实例:driver
.find_element_by_css_selector
("input.btn").value_of_css_property
("input.btn")
5.获取元素的属性值
方法:get_attribute
(element_name
)
实例:driver
.find_element_by_id
("kw").get_attribute
("kw")
6.判断元素是否被选中
方法:is_selected
()
实例:driver
.find_element_by_id
("form1").is_selected
()
7.返回元素的大小
方法:size
实例:driver
.find_element_by_id
("iptPassword").size
返回值:
{'width': 250, 'height': 30}
8.判断元素是否显示
方法:is_displayed
()
实例:driver
.find_element_by_id
("iptPassword").is_displayed
()
9.判断元素是否被使用
方法:is_enabled
()
实例:driver
.find_element_by_id
("iptPassword").is_enabled
()
10.获取元素的文本值
方法:text
实例:driver
.find_element_by_id
("iptUsername").text
11.元素赋值
方法:send_keys
(*values
)
实例:driver
.find_element_by_id
("iptUsername").send_keys
('admin')
12.返回元素的tagName
方法:tag_name
实例:driver
.find_element_by_id
("iptUsername").tag_name
13.删除浏览器所有的cookies
方法:delete_all_cookies
()
实例:driver
.delete_all_cookies
()
14.删除指定的cookie
方法:delete_cookie
(name
)
实例:deriver
.delete_cookie
("my_cookie_name")
15.关闭浏览器
方法:close
()
实例:driver
.close
()
16.关闭浏览器并且退出驱动程序
方法:quit
()
实例:driver
.quit
()
17.返回上一页
方法:back
()
实例:driver
.back
()
18.清空输入框
方法:clear
()
实例:driver
.clear
()
19.浏览器窗口最大化
方法:maximize_window
()
实例:driver
.maximize_window
()
20.查看浏览器的名字
方法:name
实例:drvier
.name
21.返回当前会话中的cookies
方法:get_cookies
()
实例:driver
.get_cookies
()
22.根据cookie name 查找映射Value值
方法:driver
.get_cookie
(cookie_name
)
实例:driver
.get_cookie
("NET_SessionId")
23.截取当前页面
方法:save_screenshot
(filename
)
实例:driver
.save_screenshot
("D:\\Program Files\\Python27\\NM.bmp")
selenium中查找页面元素的方法
driver.find_element_by_id()----通过id进行查找 input = driver.find_element_by_css_selector(’#kw’)—通过css选择器进行查找 driver.find_element_by_xpath()----通过xpath进行查找。
用selenium+phantomjs来请页面的流程
from selenium
import webdriver
1.创建driver对象
driver
= webdriver
.Phantomjs
()
2.请求url
driver
.get
(url
)
3.等待。
time
.sleep
(5)
等待有三种:
文档:selenium的三种等待
.note
链接:http
://note
.youdao
.com
/noteshare?
id=8f6a0765e4017a4140a05485a9d80a48&sub
=48D9761ED13A49EDAC64D180C8340613
(
1)强制等待:
time
.sleep
(10)
(2)隐式等待
driver
.implicitly_wait
(10)
隐式等待就是等到页面全部加载完成,比如js,css或者图片全请求到加载到页面,也就是我们常看到的页面不在转圈圈为止,程序才会继续运行。
(
3)显示等待。
from selenium
.webdriver
.support
.wait
import WebDriverWait
from selenium
.webdriver
.support
import expected_conditions
as EC
from selenium
.webdriver
.common
.by
import By
步骤:
1.创建等待对象
wait
= WebDriverWait
(
driver
,
10,最大等待时长
0.5,扫描间隔
)
2.wait
.until
(等待条件
)--->等待条件成立程序才继续运行。
等待条件在selenium中有个专门的模块来设置了一些条件
---expected_conditions
as EC
最常用的条件有一下两个:
EC
.presence_of_element_located
EC
.presence_of_all_elements_located
这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如
(By
.ID
, 'kw')
一个只要一个符合条件的元素加载出来就通过;
另一个必须所有符合条件的元素都加载出来才行
EC
.presence_of_element_located(locator对象也就是定位器)
licator对象是一个元组
(
通过什么来查找,
--By
.ID
,By
.XPATH
,By
.CSS_SELECTOR
‘查找的内容的语法’
)
3.wait
.until方法的返回值是一个对应定位器所定位到的webelement对象。你如果需要对这个webelment对象做一些点击或者其他操作,可以很方便的做到。
4.获取页面内容
html
= driver
.page_source
5.1用lxml模块解析页面内容
5.2或者用正则查找所需要的内容
tree
= etree
.HTML
(html
) pattern
=re
.compile(r
'正则语法')
tree
.xpath
(xpath语法
) pattern
.search
(html
)
例子:
import requests
,time
from lxml
import etree
from selenium
import webdriver
from selenium
.webdriver
.support
.wait
import WebDriverWait
from selenium
.webdriver
.support
import expected_conditions
as EC
from selenium
.webdriver
.common
.by
import By
from urllib
import parse
class Douban(object):
def __init__(self
,url
):
self
.url
=url
self
.driver
=webdriver
.PhantomJS
()
self
.wait
=WebDriverWait
(self
.driver
,10)
self
.parse
()
def get_text(self
,text
):
if text
:
return text
[0]
return ''
def get_content_by_selenium(self
,url
,xpath
):
self
.driver
.get
(url
)
webelement
=self
.wait
.until
(EC
.presence_of_all_elements_located
((By
.XPATH
,xpath
)))
return self
.driver
.page_source
def parse(self
):
html_str
=self
.get_content_by_selenium
(self
.url
,'//div[@id="root"]/div/div/div/div')
html
= etree
.HTML
(html_str
)
div_list
= html
.xpath
('//div[@id="root"]/div/div/div/div/div')
for div
in div_list
:
item
= {}
'''
图书名称
评分
评价数
详情页链接
作者
出版社
价格
出版日期
'''
name
= self
.get_text
(div
.xpath
('.//div[@class="title"]/a/text()'))
scores
= self
.get_text
(div
.xpath
('.//span[@class="rating_nums"]/text()'))
comment_num
= self
.get_text
(div
.xpath
('.//span[@class="pl"]/text()'))
detail_url
= self
.get_text
(div
.xpath
('.//div[@class="title"]/a/@href'))
if all([name
, detail_url
]):
item
['name'] = name
item
['scores'] = scores
item
['comment_num'] = comment_num
item
['detail_url'] = detail_url
print(item
)
if __name__
=="__main__":
kw
="python"
base_url
= 'https://search.douban.com/book/subject_search?'
params
= {
'search_text': kw
,
'cat': '1001',
'start': '0',
}
url
=base_url
+parse
.urlencode
(params
)
Douban
(url
)
selenium的三种等待
1. 强制等待
第一种也是最简单粗暴的一种办法就是强制等待sleep
(xx
),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。
from selenium
import webdriver
from time
import sleep
driver
= webdriver
.Firefox
()
driver
.get
('https://huilansame.github.io')
sleep
(3)
print driver
.current_url
driver
.quit
()
这种叫强制等待,不管你浏览器是否加载完了,程序都得等待
3秒,
3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。
2. 隐性等待
from selenium
import webdriver
driver
= webdriver
.Firefox
()
driver
.implicitly_wait
(30)
driver
.get
('https://huilansame.github.io')
print driver
.current_url
driver
.quit
()
隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。
注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,但有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步,我想等我要的元素出来之后就下一步怎么办?有办法,这就要看selenium提供的另一种等待方式——显性等待wait了。
3. 显性等待
第三种办法就是显性等待,WebDriverWait,配合该类的until
()和until_not
()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
from selenium
import webdriver
from selenium
.webdriver
.support
.wait
import WebDriverWait
from selenium
.webdriver
.support
import expected_conditions
as EC
from selenium
.webdriver
.common
.by
import By
driver
= webdriver
.Firefox
()
driver
.implicitly_wait
(10)
driver
.get
('https://huilansame.github.io')
locator
= (By
.LINK_TEXT
, '')
try:
wait
= WebDriverWait
(driver
, 20, 0.5)
wait
.until
(EC
.presence_of_element_located
(locator
))
print(driver
.find_element_by_link_text
('').get_attribute
('href'))
finally:
driver
.close
()
4、expected_conditions
expected_conditions是selenium的一个模块,其中包含一系列可用于判断的条件:
4.1
EC
.title_is
EC
.title_contains
这两个条件类验证title,验证传入的参数title是否等于或在driver
.title中
4.2
EC
.presence_of_element_located
((By
.CSS_SELECTOR
,'.ui-page > wrap'))
EC
.presence_of_all_elements_located
((By
.CSS_SELECTOR
,'.ui-page'))
这两个条件验证元素是否出现,传入的参数都是元组类型的locator,如
(By
.ID
, 'kw')
一个只要一个符合条件的元素加载出来就通过;
另一个必须所有符合条件的元素都加载出来才行
4.3
EC
.visibility_of_element_located
EC
.invisibility_of_element_located
EC
.visibility_of
这三个条件验证元素是否可见
前两个传入参数是元组类型的locator,第三个传入WebElement
第一个和第三个其实质是一样的
4.4
EC
.text_to_be_present_in_element
EC
.text_to_be_present_in_element_value
这两个判断某段文本是否出现在某元素中
一个判断元素的text,一个判断元素的value属性
4.5
EC
.frame_to_be_available_and_switch_to_it
这个条件判断frame是否可切入,
可传入locator元组或者直接传入定位方式:
id、name、index或WebElement
4.6
EC
.alert_is_present
EC
.element_to_be_clickable
第一个条件传入WebElement对象,第二个传入locator元组
EC
.element_to_be_selected
EC
.element_located_to_be_selected
EC
.element_selection_state_to_be
EC
.element_located_selection_state_to_be
EC
.staleness_of
补充:
1. 可迭代对象和迭代器:
可迭代对象就是有__iter__属性的对象
迭代器:有__next__属性的对象
两个能转化吗:
iter(可迭代对象)-----》迭代器。
可迭代对象有哪些:
list
dict
tuple
str
bytes
set
迭代器
生成器
文件流
如何打印一个文件同时输出行号。
fp = open('shabei_spider.py','r',encoding='utf-8')
print(fp)
#如何输出行号。
for i,c in enumerate(fp,1):
print(i,c)
2. replace() 将字符串内容替换
# https://music.163.com/artist/desc?id=1881
# https://music.163.com/artist/?id=1881
url=singer_urls[i].replace('?id','desc?id')
3. enumerate(可迭代对象,数字)
for i,name in enumerate(singer_names): #enumerate(可迭代对象,数字) 枚举的方法,里面的第一个参数是可迭代对象,第二个参数是表示从第几位开始,默认从0开始。前面i的值就为0,1,2,3,4.....
item={}
item['name']=name
item['url']=singer_urls[i]
4. join(列表) 将列表里的数据合并,前面写什么就用什么将其合并
desc_list = html.xpath('//div[@class="n-artdesc"]/p/text()')
desc = ''.join(desc_list)