记selenium的一次应用

IDE最先用的是vs code,但是出现异常重新运行很麻烦,最终还是转战jupyter notebook:一方面可以开启引擎后边写代码边调试,另一方面url、文件保存路径边改边跑也比较方便。

造轮子

先导库:

from selenium import webdriver
from selenium.webdriver import ActionChains
import requests as req
import time
import os
import re

开启Chrome驱动,窗口最大化可选(主要是因为这次模拟的网页需要登陆,小窗口登陆界面施展不开)。

# 开启引擎
driver = webdriver.Chrome() 
driver.maximize_window()

用驱动打开url,这里隐式等待20s进行登陆。

# 进入网页
url = ''
driver.get(url)
driver.implicitly_wait(20)

这里找到按钮,然后使用ActionChains模拟点击,等1s。

# 转到对应界面
button = driver.find_element_by_css_selector('span.c1 ')
ActionChains(driver).move_to_element(button).click(button).perform()
time.sleep(1)

这里需要注意下,因为一开始直接F12找到对应的窗体后报出异常说找不到对应的元素,后来仔细看了一下是因为前端用了两个frame藏起来了,于是switch_to.frame()进入子框架后再操作,自然地最后两条语句就是回到父框架,不过这里回不回无所谓,但是自己有强迫症…

这里简单说一下代码逻辑:

  1. driver.find_element_by_css_selector()找到对应的elemtent;
  2. .get_attribute('src')获取src属性中的url;
  3. 在切换子页面的过程中发现图片的url只是最后的’1.png’的编号有变化,所以接下来三句话处理了一下url。

说一下细节:

  1. re.search(pattern, string)对string应用pattern的正则表达式,.span()返回一个对应位置左闭右开的二元组,[0]返回元组的第一个值;{}准备对字符串进行格式化,str.format()将代替{}中的内容。
  2. 当需要得到的元素同名时,可以采用driver.find_elements_by_css_selector(),该方法返回一个列表。
  3. list = [item(i) for i in range() if ...],这样生成了列表比较优美。
# 获取图片
driver.switch_to.frame('iframe')
driver.switch_to.frame('ext-gen1039')

img_elem = driver.find_element_by_css_selector('img.documentImg')
img_url = img_elem.get_attribute('src')
img_url_general = img_url[:re.search(r'1.png', img_url).span()[0]] + '{}' + '.png'
sumPage = int(driver.find_element_by_css_selector('span.all').text)
img_urls = [img_url_general.format(i + 1) for i in range(sumPage)]

driver.switch_to.parent_frame()
driver.switch_to.parent_frame()

os库改路径建folder

# 改路径
folder_path = ' '
if os.path.exists(folder_path) == False:
    os.makedirs(folder_path)
os.chdir(folder_path)

将文件保存本地:

  1. 通过requests.get()向服务器发出请求(对应图片的url);
  2. r.content是返回值的二进制结果,也就是服务器返回的图片的二进制编码文本;
  3. 将二进制编码文本用f.write()写入文件,当然文件要以二进制方式打开。
# 图片保存本地
for i in range(len(img_urls)):
    with open(str(i+1) + '.png', 'wb') as f:
        r = req.get(img_urls[i])
        f.write(r.content)
        f.flush() # 清空缓存区
        f.close()

退出引擎:

driver.quit()

涉及到的操作

  1. selenium的元素选择、属性获取、动作链
  2. 一句话生成列表
  3. 正则表达式应用
  4. 已知图片url将图片保存本地

接下来

  1. 隐式等待改为显示等待,提高效率
  2. 更多选择元素的方法
  3. google切换标签页
  4. 怎么将动作集合,最后perform()

发表评论

电子邮件地址不会被公开。 必填项已用*标注