利用selenium可以模拟浏览器操作,降低爬虫被禁的概率。
运行平台: Windows
Python版本: Python 3.8
IDE: Pycharm
这篇主要是对一些selenium基本操作的介绍
1.Python3.X版本中自带PIP,我们使用PIP安装selenium。Win+R打开命令行,输入cmd进入,输入 pip install selenium即可,它会自动安装。
2.我们还需要浏览器驱动,以chrome浏览器为例,打开网页搜索chromedriver,选择自己所需的版本,解压出一个exe文件,把它放在一个纯英文的路径中就可以。写代码时,把这个路径写进去就行了,Python会自动使用的。如下面的代码。
import time
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') # 打开网页
print(driver.page_source) # 得到网页源码
time.sleep(5)
driver.close() # 关闭当前标签页
time.sleep(3)
driver.quit() # 关闭所有标签页,退出浏览器
.get():打开网页
.page_source :得到网页源码
.close():关闭当前标签页
.quit():关闭所有标签页,退出浏览器
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
inputTag = driver.find_element_by_name('wd')
inputTag = driver.find_element_by_id('kw')
inputTag = driver.find_element_by_class_name('s_ipt')
inputTag.send_keys('python')
.find_element_by_name():使用name定位元素
.find_element_by_id():使用id定位元素
.find_element_by_class_name():使用类名定位元素
.send_key():使用内容填充,定位到的元素
.find_element_ 适用于查找第一个元素,find_elements_ 适用于查找所有符合条件的元素。
这段代码的效果就是python输入百度的搜索框(3种定位方式选择1种就可以)
import time
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com') # 打开网页
inputTag = driver.find_element_by_name('wd')
inputTag.send_keys('python')
time.sleep(3)
inputTag.clear() # 清除输入框的内容
操作输入框,分两步:
第一步:找到该元素.
第二步:使用send_keys(value),将数据填充进去.
这段代码的效果就是python输入百度的搜索框,三秒后消除输入框的内容。
import time
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://accounts.douban.com/passport/login?source=main')
inputTag = driver.find_element_by_id('account-form-remember')
inputTag.click()
time.sleep(3)
inputTag.click()
.click():可以实现鼠标左键单击效果
.click_and_hold() :点击但不松开鼠标
.context_click() :右键单击
.double_click() :双击
要选中checkbox标签,在网页中是通过鼠标点击,因此想要选中checkbox标签,要先找到该元素,然后执行click()事件
这段代码的效果就是打开豆瓣的登陆界面选择下次自动登录,暂停3s后,取消勾选。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.ctrip.com/')
selectBtn = Select(driver.find_element_by_id('J_roomCountList'))
selectBtn.select_by_index(3) # 使用索引值
selectBtn.select_by_value('') # 使用值
selectBtn.select_by_visible_text('') # 使用文本
.select_by_index():使用索引值选择下拉框中的内容
.select_by_value(’’) :使用值选择下拉框中的内容
.select_by_visible_text(’’) :使用文本选择下拉框中的内容
select不能直接点击.因为点击后还要选中元素.
这时候selenium专门为select标签提供一个类selenium.webdriver.support.ui.select.
将获取到的元素当成参数传入这个类中,创建这个对象,然后就可以使用这个对象进行选择了.
这段代码的效果是打开携程首页,在房间间数选择4间。(3种方法选择其中1种就可以了)
有时候网页的操作可能要有很多步,那么这时候可以使用鼠标行为链ActionChain完成.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
inputTag = driver.find_element_by_id('kw')
submitBtn = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag, 'python')
actions.move_to_element(submitBtn)
actions.click()
actions.perform() # 执行上述的行为链
这段代码的效果就是打开百度网页,在输入框输入python点击搜索。
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
for cookie in driver.get_cookies():
print(cookie) # 获取所有的cookie
value = driver.get_cookie('key') # 根据cookie的key获取value
driver.delete_all_cookies() # 删除所有cookie
driver.delete_cookie('key') # 删除某个cookie值
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com')
driver.execute_script("window.open('https://www.douban.com')") # 打开一个新的网页
print(driver.current_url) # 说明虽然在窗口中切换到了新的页面,但是driver中还没有切换,所以要用switch_to.window
driver.switch_to.window(driver.window_handles[1]) # 切换网页,window_handles代表网页的创建顺序
print(driver.current_url)
虽然使用execute_script() 打开了一个新的网页,但是通过**.current_url** 可以看到实际浏览器访问的网页还是百度,所以要使用 .switch_to.window() 切换到当前网页。
from selenium import webdriver
driver_path = r'E:\PythonProject\Spider\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=https://120.83.108.72:9999")
driver = webdriver.Chrome(executable_path=driver_path, options=options)
driver.get('https://www.ipip.net/ip.html')
这段代码的效果就是打开代理后的网页,查看IP信息。