Selenium 库里有个叫 WebDriver 的 API,WebDriver 可以加载网站的浏览器,但是也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。
1.加载网页
selenium通过控制浏览器,所以对应的获取的数据都是elements中的内容。
from selenium import webdriver
# 指定driver的绝对路径,也就是制定驱动程序的位置
# driver = webdriver.PhantomJS(executable_path='/home/worker/Desktop/driver/phantomjs')
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
# 向url发起请求
driver.get("http://www.itcast.cn/")
# 把网页保存为图片
driver.save_screenshot("itcast.png")
# 退出模拟浏览器,一定要退出!不退出会有残留进程!
driver.quit()
2.定位和操作:
以百度搜索为例:
import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get("https://www.baidu.com/")
driver.find_element_by_id('kw').send_keys('python')
driver.find_element_by_id('su').click()
time.sleep(6)
driver.quit()
3.查看请求信息:
driver.page_source # 查看网页源码
driver.get_cookies() # 获取当前浏览器的全部cookies
driver.current_url # 获取当前页面的url
4.退出
driver.close() #退出当前页面
driver.quit() #退出浏览器
5.selenium的定位操作
定位元素语法:
find_element_by_id (返回一个元素)
find_elements_by_xpath (返回一个包含元素的列表)
find_elements_by_link_text (根据连接文本获取元素列表)
find_elements_by_partial_link_text (根据链接包含的文本获取元素列表)
find_elements_by_tag_name (根据标签名获取元素列表)
find_elements_by_class_name (根据类名获取元素列表)
注意:
find_element和find_elements的区别:
多了个s就返回列表,没有s就返回匹配到的第一个 。
by_link_text和by_partial_link_tex的区别:
全部文本和包含某个文本。
举例:
以豆瓣首页为例: https://www.douban.com/
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
ret1 = driver.find_element_by_id("anony-nav")
print(ret1)
# 输出为:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>
ret2 = driver.find_elements_by_id("anony-nav")
print(ret2)
#输出为:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>]
ret3 = driver.find_elements_by_xpath("//*[@id='anony-nav']/h1/a")
print(len(ret3))
#输出为:1
ret4 = driver.find_elements_by_tag_name("h1")
print(len(ret4))
#输出为:1
ret5 = driver.find_elements_by_link_text("下载豆瓣 App")
print(len(ret5))
#输出为:1
ret6 = driver.find_elements_by_partial_link_text("豆瓣")
print(len(ret6))
#输出为:24
driver.close()
获取数据语法:
find_element仅仅能够获取元素,还能直接获取其中的数据。如果需要获取数据需要使用以下方法:
- 获取文本:element.text
- 获取属性值:element.get_attribute(“href”)
使用示例:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.douban.com/")
ret7 = driver.find_elements_by_tag_name("h1")
print(ret7[0].text)
#输出:豆瓣
ret8 = driver.find_elements_by_link_text("下载豆瓣 App")
print(ret8[0].get_attribute("href"))
#输出:https://www.douban.com/doubanapp/app?channel=nimingye
driver.close()
总结:
- 根据xpath定位元素:driver.find_elements_by_xpath("//*[@id=‘s’]/h1/a")
- 根据class定位元素:driver.find_elements_by_class_name(“box”)
- 根据link_text定位元素:driver.find_elements_by_link_text(“下载豆瓣 App”)
- 根据tag_name定位元素:driver.find_elements_by_tag_name(“h1”)
- 获取文本内容:element.text 获取标签属性: element.get_attribute(“href”)
来源:CSDN
作者:SpiderLiH
链接:https://blog.csdn.net/weixin_38819889/article/details/103646878