Python web crawler(8)selenium的使用
1.安装:selenium
在本地终端中安装
pip install selenium
2.下载浏览器API包:(chrome浏览器)
它与其他库不同的地方是他要启动你电脑上的浏览器, 这就需要一个驱动程序来辅助.
这里推荐用chrome浏览器
chrome驱动地址:
114.0.5735.90之前版本的驱动地址:
http://chromedriver.storage.googleapis.com/index.html
122之后版本的驱动地址:(下载不动可能需要一些魔法)
https://googlechromelabs.github.io/chrome-for-testing/
找到对应的浏览器版本,下载
根据你电脑的不同自行选择win64或win32
3.解压安装
下载的浏览器驱动包放在python解释器所在的文件夹(要把chrome-win64.zip包解压)
如果你是Windwos:
查看Python路径
py -0p
例如:open /usr/local/bin/
4.测试登录网站:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建实例化浏览器对象
driver = webdriver.Chrome()
# 访问网址
driver.get('https://www.baidu.com')
# 打印获取的title
print(driver.title)
# 截图并保存为baidu.png
driver.save_screenshot('baidu.png')
time.sleep(3)
# 退出浏览器
driver.quit()
请确保你已经正确安装了Chrome驱动,并将其放在指定的路径中。如果你将“Chrome驱动添加到系统的环境变量中”或者“按照上述操作在解释器路径下”,那么你可以直接使用webdriver.Chrome()
而无需指定路径,因为系统会自动找到驱动文件。
5.其他:在代码中指定驱动路径
如果你没有按照上述需求,将驱动放在解释器的指定路径下,你还可以
1.驱动与运行脚本代码在同一路径:
# 浏览器驱动和脚本放在同一路径下,那就是指定与运行脚本一起的当前路径下chrome-win64文件夹中
driver = webdriver.Chrome(executable_path="chrome-win64")
2.指定其他路径:
# 指定Chrome驱动路径
driver = webdriver.Chrome(executable_path="您的Chrome驱动路径")
将"您的Chrome驱动路径"
替换为您实际的Chrome驱动文件(chromedriver.exe)的路径。这个路径可以是相对路径或绝对路径。确保将路径中的反斜杠(\)替换为正斜杠(/)或使用原始字符串(r"...")以避免转义字符的问题。
6.基本使用
1、定位和操作:
一般来说,ID是唯一的,这里以ID为例
# 搜索百度关键字 周杰伦
driver.find_element(By.ID, "kw").send_keys("周杰伦")
# 点击百度的搜索按钮id为su
driver.find_element(By.ID, "su").click()
2、查看请求信息:
driver.page_source # 获取渲染后的页面代码
driver.get_cookies() # 获取当前浏览器中所有cookies
driver.current_url # 通过driver.current_url来获取当前页面的完整URL,如果发生了跳转,则是跳转后的最终页面URL
3、退出
driver.close() # 退出当前页面
driver.quit() # 退出浏览器
自动化截图效果
7.高阶使用
# 精确定位一个元素,返回结果为一个element对象,定位不到则报错
driver.find_element(By.xx, value)
# 定位一组元素,返回结果为element对象列表,定位不到返回空列表
driver.find_elements(By.xx, value)
# By.ID 使用id值定位
el = driver.find_element(By.ID, '')
# By.XPATH 使用xpath定位
el = driver.find_element(By.XPATH, '')
# By.TAG_NAME. 使用标签名定位
el = driver.find_element(By.TAG_NAME, '')
# By.LINK_TEXT使用超链接文本定位
el = driver.find_element(By.LINK_TEXT, '')
# By.PARTIAL_LINK_TEXT 使用部分超链接文本定位
el = driver.find_element(By.PARTIAL_LINK_TEXT , '')
# By.NAME 使用name属性值定位
el = driver.find_element(By.NAME, '')
# By.CLASS_NAME 使用class属性值定位
el = driver.find_element(By.CLASS_NAME, '')
# By.CSS_SELECTOR 使用css选择器定位
el = driver.find_element(By.CSS_SELECTOR, '')
定位后获取数据:
# 获取key属性名对应的属性值
el.get_attribute(key)
# 获取开闭标签之间的文本内容
el.text
# 对元素执行点击操作
el.click()
# 对元素执行提交操作
el.submit()
# 清空可输入元素中的数据
el.clear()
# 向可输入元素输入数据
el.send_keys(data)
页面等待的三种方法
import time time.sleep(n) # 阻塞等待设定的秒数之后再继续往下执行
- 显式等待(自动化web测试使用,爬虫基本不用)
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WebDriverWait(driver, 10,0.5).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) # 显式等待指定某个条件,然后设置最长等待时间10,在10秒内每隔0.5秒使用指定条件去定位元素,如果定位到元素则直接结束等待,如果在10秒结束之后仍未定位到元素则报错
- 隐式等待(推荐)隐式等待设置之后代码中的所有元素定位都会做隐式等待
driver.implicitly_wait(10) # 在指定的n秒内每隔一段时间尝试定位元素,如果n秒结束还未被定位出来则报错
注意:Selenium显示等待和隐式等待的区别
1、显示等待原理:
显示等待,就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception(简而言之,就是直到元素出现才去操作,如果超时则报异常)
2、隐式等待原理:
隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
8.拿Cookie
模拟登录后,获取cookies,并用cookies再次代入登录
import json
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
url = "https://1.x.x.x/login"
# 当使用Selenium打开URL时提示“您的连接不是私密连接”或类似的消息时,需要去掉证书校验
chrome_options = Options()
chrome_options.add_argument("--ignore-certificate-errors")
# 代入Options参数创建实例化浏览器对象
driver = webdriver.Chrome(options=chrome_options)
# 访问网址
driver.get(url)
time.sleep(5)
# 填写账号、密码
# driver.find_element(By.ID, "uedc-ppkg-login_input kphc ui-autocomplete-input").send_keys("my_count")
# driver.find_element(By.ID, "password").send_keys("123456")
driver.find_element(By.XPATH, '/html/body/div[3]/div[3]/table/tbody/tr/td/div[2]/form/div[1]/div[1]/div/input').send_keys("my_count")
driver.find_element(By.XPATH, '/html/body/div[3]/div[3]/table/tbody/tr/td/div[2]/form/div[1]/div[2]/div/input').send_keys("123456")
# 勾选“我已知晓选项”
done1 = driver.find_element(By.XPATH, '/html/body/div[3]/div[3]/table/tbody/tr/td/div[2]/form/div[2]/label/span[1]/input')
done1.click()
# 点击登录
done2 = driver.find_element(By.XPATH, '/html/body/div[3]/div[3]/table/tbody/tr/td/div[2]/form/button')
done2.click()
time.sleep(5)
# 获取登录后的cookie
cookies = driver.get_cookies()
# print(cookies)
# print(type(cookies))
# 写入cookie
with open('cookies.txt', 'w') as f:
f.write(json.dumps(cookies))
driver.quit()
再次访问页面时,读取cookie即可
from selenium import webdriver
import json
url = "https://1.x.x.x/login"
# 当使用Selenium打开URL时提示“您的连接不是私密连接”或类似的消息时,需要去掉证书校验
chrome_options = Options()
chrome_options.add_argument("--ignore-certificate-errors")
# 代入Options参数创建实例化浏览器对象
driver = webdriver.Chrome(options=chrome_options)
# 访问网址
driver.get(url)
# 读取cookie
with open('cookies.txt', 'r') as f:
cookies = json.loads(f.read())
# 当直接使用cookies有问题的时候,需要导一下cookies为cookie_dict{}
# 循环将cookie放入当前的访问cookie_dict字典{}
for cookie in cookies:
cookie_dict = {}
for k, v in cookie.items():
cookie_dict[k] = v
print(cookie_dict)
driver.add_cookie(cookie_dict)
# 页面刷新 不刷新 cookie可能没加载进去 会出现问题, 所以要刷新一下
driver.refresh()
driver.get(url)