selenium写一个自动化程序查看作业的未提交名单

selenium写一个自动化程序

7.17

  1. 结合selenium写一个自动化程序,完成的功能(看哪些人提交了,哪些人没提交)
  • 遇到的难点1:定位某一个用户名

  • 解决方案1:元素定位并优化

    • 经常使用的jupyter快捷键命令

      Alt + Enter : 运行本单元,在下面插入一单元

      Shift-Enter : 运行本单元,选中下个单元

      Ctrl-Enter : 运行本单元

      Shift + Tab : 提示(对于函数的提示)
      Ctrl + Shift + - : 分割单元
      ctrl + D : 删除该行内容
      ctrl + U : 撤销
      ctrl + / : 注释

    • 元素定位的方法

      首先,右击→检查→F12中定位到对应位置

      新闻

      • 根据id定位:element = web.find_element_by_id(“kw”)
      • 根据name定位:element = web.find_element_by_name(“wd”)
      • class name定位:element = web.find_element_by_class_name(‘s_ipt’)
      • 根据tag定位:element = web.find_element_by_tag_name(‘input’)
      • link text定位:element = web.find_element_by_link_text(‘新闻’)
      • partial link text定位:element = web.find_element_by_partial_link_text(‘闻’)
      • XPath定位:绝对路径右击→copy→copy full xpath;相对路径(推荐!)右击→copy→copy xpath;find_element_by_xpath
      • css selector定位:右击→copy→copy selector element = web.find_element_by_css_selector(“#kw”);element = web.find_element_by_css_selector(“.s_ipt”);element = web.find_element_by_css_selector(“input”);element = web.find_element_by_css_selector(‘[id=“kw”]’)
        ;element = web.find_element_by_css_selector(‘input[id=“kw”]’);element=web.find_element_by_css_selector(‘[class=“s-top-left-new s-isindex-wrap”]’)(属性带空格,只能用css selector)
    • 另一种表达

      from selenium.webdriver.common.by import By
      element = web.find_element(By.ID,‘kw’)
      element = web.find_element(By.NAME,‘wd’)
      element = web.find_element(By.CLASS_NAME,‘s_ipt’)
      element = web.find_element(By.TAG_NAME,‘input’)
      element = web.find_element(By.LINK_TEXT,‘新闻’)
      element = web.find_element(By.PARTIAL_LINK_TEXT,‘闻’)
      element = web.find_element(By.XPATH,‘//*[@id=“kw”]’)
      element = web.find_element(By.CSS_SELECTOR,‘#kw’)
      element = web.find_element(By.CSS_SELECTOR,‘[id=“kw”]’)
      element = web.find_element(By.CSS_SELECTOR,‘input[id=“kw”]’)

    • 定位方法选择

      id>name>css>XPath

      定位多个元素,就是把上述element后面多了复数标识s,变为elements,其他操作一致。

  • 已完成:可定位某一个提交的用户名

  • 遇到的难点2:某一页中循环定位多个已提交的用户

  • 解决方案2

    使用循环遍历range(224873, 224882)来构建每个id对应的XPath表达式。然后,通过driver.find_element()方法和XPath表达式定位到对应的用户名元素。如果找到了用户名元素,则获取其文本内容并打印出来。如果未找到用户名元素,会打印相应的提示信息。

  • 已完成:可查出某一页中多个用户名

  • 遇到的难点3:翻页定位全部已提交的用户

  • 解决方案3

    • 动态获取page

      使用driver.find_element_by_xpath()方法和XPath表达式’//div[@class=“page”]'来定位包含页数信息的元素。然后,我们使用text属性获取该元素的文本内容。接下来,我们通过解析文本内容,获取页数的数值。

    • 动态获取每一页的id

      使用driver.find_elements()方法和XPath表达式’//*[@id]'来获取页面中所有包含id属性的元素。然后,我们遍历这些元素,通过get_attribute(‘id’)方法获取每个元素的id值。如果id值以pid开头,我们构建相应的XPath表达式,并使用driver.find_element()方法进行定位。

    • 联合

  • 已完成:可查出全部已提交的用户名

  • 遇到的难点4:已提交的用户会有重复的(原因在于有人发布了多条信息(如帮忙代交、超级版主发布了多条信息等))

  • 解决方案4:

    创建了一个集合printed_usernames来存储已经打印过的用户名。在遍历每个用户名时,我们首先检查用户名是否已经存在于集合中,如果不存在,则打印用户名并将其添加到集合中,否则跳过打印。

  • 已完成:可查出已提交的去重后的用户名

  • 遇到的难点5:对比已有名单,给出未交名单

  • 解决方案4:

  • 已完成:给出未提交作业的名单

代码

#安装需要的包
#并且下载对应谷歌浏览器版本的谷歌驱动 最好放在anaconda1的安装目录下  http://chromedriver.storage.googleapis.com/index.html
from selenium import webdriver
from selenium.webdriver.common.by import By

# 访问首页
browser = webdriver.Chrome()
#这里是提交作业的网址
browser.get(r'http://')

#动态获得page的页数
page_element = browser.find_element_by_xpath('//*[@id="ct"]/div[6]/div')
page_text = page_element.text
page_number = int(page_text.split(' ')[1])
print(page_number)

#获取已提交的用户名单
# 创建一个集合用于存储已经打印过的用户名
printed_usernames = set()

# 创建一个计数器变量来记录已经打印过的用户名数量
username_count = 0

# 循环遍历页面范围
for page in range(1, page_number+1):
    # 构建页面URL
    url = f'http://&page={page}'

    # 打开网页
    browser.get(url)

    # 获取页面中包含id的元素
    elements = browser.find_elements(By.XPATH, '//*[@id]')

    # 遍历元素,获取id值并进行定位
    for element in elements:
        element_id = element.get_attribute('id')
        if element_id.startswith('pid'):
            # 构建XPath表达式
            xpath = f'//*[@id="{element_id}"]/tbody/tr[1]/td[1]/div[1]/div/a'

            try:
                # 定位用户名元素
                username_element = browser.find_element(By.XPATH, xpath)
                # 获取用户名文本
                username = username_element.text

                # 检查用户名是否已经打印过,若未打印过则打印并加入集合,并增加计数器
                if username not in printed_usernames:
                    print(username)
                    printed_usernames.add(username)
                    username_count += 1
            except:
                print(f'未找到id为 {element_id} 的用户名元素')

# 输出统计的用户名数量
print(f'已提交的用户数量:{username_count}')

#获取未提交的用户名单
#已知的用户名单
known_usernames = [
    "***", "***"
]
# 获取未提交的用户名列表
unsubmitted_usernames = [username for username in known_usernames if username not in printed_usernames]

# 输出未提交的用户名列表
for username in unsubmitted_usernames:
    print(username)

你可能感兴趣的:(机器学习,selenium,自动化,tensorflow)