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

如果你是MAC: open + 路径

例如: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)

页面等待的三种方法

  1. 强制等待
    import time
    time.sleep(n)      # 阻塞等待设定的秒数之后再继续往下执行
  2. 显式等待(自动化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秒结束之后仍未定位到元素则报错
  3. 隐式等待(推荐)隐式等待设置之后代码中的所有元素定位都会做隐式等待
    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)

 

posted @ 2024-02-28 16:14  Magiclala  阅读(68)  评论(0编辑  收藏  举报