爬虫必备之selenium
selenium是一个自动化测试的工具,我不是搞那方面的,所以也在那方面的具体应用不太了解。但是,这并不影响我在爬虫和其它方面的使用。
安装: 使用pip安装就可以了。
注:使用selenium之前需要下载chromedriver.exe放入chorme安装的文件夹,并配置环境变量哦!具体自行百度解决。
具体使用:
一、.声明浏览器对象:browser = webdriver.Chrome()
二、.访问页面: browser.get('https://www.baidu.com') #访问url,也就是相当于在地址栏上访问url
其它操作:
print(browser.page_source) #查看网页源码 print(browser.get_cookies()) #查看cookies print(browser.current_url) #查看url
三、查找元素:.
1.查找单个元素:
常用:
input_1 = browser.find_element_by_id('q') #查找id为q的那个标签包含的东西 input_2 = browser.find_element_by_css_selector('#q') # '#'选择id,‘.’选择class input_3 = browser.find_element_by_xpath('//*[@id="q"]') #使用xpath语法选择 print(input_1,input_2,input_3)
其它常用查找语法:
## browser.find_element_by_id ## browser.find_element_by_xpath ## browser.find_element_by_link_text 通过链接文字定位 ## browser.find_element_by_partial_link_text 通过链接文字的部分文字定位 ## browser.find_element_by_tag_name ## browser.find_element_by_class_name ## browser.find_element_by_css_selector # 通用方法: browser.find_element(a,b) 参数a填入查找方式(如By.ID),参数b填入查找的目标 # 例如:browser.find_element(By.ID,'q')
查找单个元素的通用方法查找:
一个例子:
browser.get('https://www.taobao.com') input_first = browser.find_element(By.ID,'q') #其它的按需要更改第一个参数与第二个参数、其它参数
2.查找多个元素
查找多个元素 在通用查找方法的基础上element加个s,代表复数即多个查找
常用:
browser = webdriver.Chrome() browser.get('https://www.taobao.com') lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li') #返回id为service-bd的标签下的所有li标签。 print(lis)
其它常用查找语法:
# 查找多个元素: ## browser.find_elements(By.CSS_SELECTOR,'') ## browser.find_elements(By.ID,'') ## browser.find_elements(By.LINK_TEXT,'') 通过链接文字定位 ## browser.find_elements(By.PARTIAL_LINK_TEXT,'') 通过链接文字的部分文字定位 ## browser.find_elements(By.TAG_NAME) ## browser.find_elements(By.XPATH) ## browser.find_elements(By.CLASS_NAME) # browser.find_elements(a,b) 参数a填入查找方式(如By.ID),参数b填入查找的目标 # 例如:browser.find_elements(By.ID,'q li') 查找id为q的标签内的所有li标签,并返回
四、元素交互动作:
browser = webdriver.Chrome() browser.get('https://www.taobao.com') input1 = browser.find_element(By.ID,'q') #**id为q所在的标签对应是一个搜**索框 input1.send_keys('oppo') #将搜索框的搜索内容的值置为 'oppo',也就是在搜索框输入 oppo. time.sleep(5) input1.clear() #清除搜索框 button = browser.find_element(By.CLASS_NAME,'btn-search') #查找'搜索'按钮,并创建搜索按钮对象 button.click() #点击搜索
五、执行JavaScript
from selenium import webdriver import time #实现下拉屏幕 browser = webdriver.Chrome() browser.get('https://www.zhihu.com\explore') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #滑动到最底部 browser.execute_script('alert("complte")') #在实现下拉功能之后,弹窗提示。
六、获取元素信息
1.获取属性值
logo = browser.find_element(By.ID,'zh-top-link-logo') #查找id为zh-top-link-logo的标签 logo_class = logo.get_attribute('class') #获取id为zh-top-link-logo的标签的class属性,并赋值给变量logo_class
2.获取文本值
# zu-top-add-question 为class属性的值,这里用来定位使用,定位到class属性的值为 zu-top-add-question的标签。 logo = browser.find_element(By.CLASS_NAME,'zu-top-add-question') print(logo.text) # 3.获取ID、位置、标签名、大小 print(logo.id) print(logo.location) print(logo.tag_name) print(logo.size)
七、等待:
1.隐式等待
当使用了隐式等待 执行测试的时候,如果webdriver没有在DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。
也就是当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间是0.
我觉得用来判断监测页面是否能否及时刷新和出来。
browser.implicitly_wait(10) #默认是0 browser.get('https://www.zhihu.com\explore') input = browser.find_element(By.CLASS_NAME,'zu-top-add-question')
2.显示等待
人工给定一个最长等待时间,在该最长等待时间内,如果判断是True,则返回值,
如果一直是Flase,则会一直等待,若是超出最长等待时间,则返回异常。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() browser.get('http://www.taobao.com/') wait = WebDriverWait(browser,300) #传入最长等待时间 input = wait.until(EC.presence_of_element_located((By.ID,'q'))) #定义等待条件,直到....返回True时...返回值 print(input)
八、 cookies
大家心里都有数的,直接上代码:
browser = webdriver.Chrome() browser.get('https://www.zhihu.com\explore') print(browser.get_cookies()) #获取cookies browser.add_cookie({'name':'chenruhai','domain':'www.zhihu.com','value':'germey'}) print(browser.get_cookies()) #添加cookie之后再次查看 browser.delete_all_cookies() #删除所有cookie记录 print(browser.get_cookies())
其实还可以切换浏览器的标签页:
from selenium import webdriver import time 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(2) browser.switch_to_window(browser.window_handles[0]) #切换回第一个选项卡,然后get新的url,也就是在第一个选项卡访问别的url browser.get('https://www.python.org/') browser.execute_script('window.open()') #在第二个基础上,打开(增加)下一个选项卡 browser.switch_to_window(browser.window_handles[2])