sjjy1813 发表于 2023-2-28 19:41:19

想写个脚本,自动删除网页上的文件,总是无法登陆

本帖最后由 sjjy1813 于 2023-2-28 19:46 编辑

想写个脚本,自动删除百度文库上的文件,但是在登陆这块,总是无法执行下去,cookie这块无法模拟,至于后面的功能,也没办法测试是否对了,求大神帮忙看看,到底哪里出了问题
基本思路是:
1、打开BD文库网页,通过cookie登陆账号;2、检测登陆完成后,进入创作中心,3、在创作中心页面下,进入“文档”页面;4、进入“付费”页面;5、统计每页每个网页链接下列表状态,筛选出状态为未通过、未上架的文档链接;6、通过筛选出的未通过、未上架文档的删除按键,删除该文档,每次间隔设置为7秒


import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 设置Chrome驱动路径
chrome_driver_path = "D:/chromedriver.exe"

# 创建Chrome浏览器实例
from selenium.webdriver.chrome.service import Service

service = Service(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service)


# 利用cookie模拟登陆
driver.get("h t t p s://cuttlefish.baidu.com/")
cookie = {'name': 'BDUSS', 'value': '这里就不写了'}
driver.add_cookie(cookie)

# 进入文档页面
wait = WebDriverWait(driver, 20)
driver.get("htt p s://cuttlefish.baidu.c o m/shopmis?_wkts_=xxxxxxxxxx#/commodityManage/documentation")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".ant-tabs-tab:nth-child(2)")))
driver.find_element_by_css_selector(".ant-tabs-tab:nth-child(2)").click()

# 统计每页每个网页链接下列表状态,筛选出状态为未通过、未上架的文档链接,并删除
while True:
    # 获取所有文档链接
    doc_links = driver.find_elements_by_css_selector(".doc-link")
    for link in doc_links:
      # 获取文档状态
      status = link.find_element_by_css_selector(".status").text
      if status == "未通过" or status == "未上架":
            # 点击删除按钮
            link.find_element_by_css_selector(".doc-del").click()
            # 等待弹出确认窗口
            wait.until(EC.alert_is_present())
            # 确认删除
            alert = driver.switch_to.alert
            alert.accept()
            # 等待7秒
            time.sleep(7)
            # 返回文档页面
            driver.get("h t t ps ://cu ttlefish.ba idu.c o m/shopmis?_wkts_=xxxxxxxxxx#/commodityManage/documentation)
            wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".ant-tabs-tab:nth-child(2)")))
            driver.find_element_by_css_selector(".ant-tabs-tab:nth-child(2)").click()
    # 判断是否存在下一页
    next_page = driver.find_element_by_css_selector(".ant-pagination-next")
    if "ant-pagination-disabled" in next_page.get_attribute("class"):
      break
    # 点击下一页
    next_page.click()
    # 等待页面刷新
    time.sleep(3)

不让发链接,里面的网址都加了空格

wp231957 发表于 2023-3-1 09:25:50

涉及用户登录,不太好帮

isdkz 发表于 2023-3-1 09:42:22

本帖最后由 isdkz 于 2023-3-1 09:43 编辑

你可能需要在添加cookie后刷新浏览器才能显示登录后的页面。

你可以使用 driver.refresh() 来刷新浏览器

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 设置Chrome驱动路径
chrome_driver_path = "chromedriver.exe"

# 创建Chrome浏览器实例
from selenium.webdriver.chrome.service import Service

service = Service(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service)


# 利用cookie模拟登陆
driver.get("https://cuttlefish.baidu.com/")
cookie = {'name': 'BDUSS', 'value': ''}
driver.add_cookie(cookie)
driver.refresh()                  # 加这个刷新一下浏览器 cookie 才会生效

# 进入文档页面
wait = WebDriverWait(driver, 20)
driver.get("https://cuttlefish.baidu.com/shopmis?_wkts_=xxxxxxxxxx#/commodityManage/documentation")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".ant-tabs-tab:nth-child(2)")))
driver.find_element_by_css_selector(".ant-tabs-tab:nth-child(2)").click()

# 统计每页每个网页链接下列表状态,筛选出状态为未通过、未上架的文档链接,并删除
while True:
    # 获取所有文档链接
    doc_links = driver.find_elements_by_css_selector(".doc-link")
    for link in doc_links:
      # 获取文档状态
      status = link.find_element_by_css_selector(".status").text
      if status == "未通过" or status == "未上架":
            # 点击删除按钮
            link.find_element_by_css_selector(".doc-del").click()
            # 等待弹出确认窗口
            wait.until(EC.alert_is_present())
            # 确认删除
            alert = driver.switch_to.alert
            alert.accept()
            # 等待7秒
            time.sleep(7)
            # 返回文档页面
            driver.get("https://cuttlefish.baidu.com/shopmis?_wkts_=xxxxxxxxxx#/commodityManage/documentation")
            wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".ant-tabs-tab:nth-child(2)")))
            driver.find_element_by_css_selector(".ant-tabs-tab:nth-child(2)").click()
    # 判断是否存在下一页
    next_page = driver.find_element_by_css_selector(".ant-pagination-next")
    if "ant-pagination-disabled" in next_page.get_attribute("class"):
      break
    # 点击下一页
    next_page.click()
    # 等待页面刷新
    time.sleep(3)

sjjy1813 发表于 2023-3-1 17:18:01

isdkz 发表于 2023-3-1 09:42
你可能需要在添加cookie后刷新浏览器才能显示登录后的页面。

你可以使用 driver.refresh() 来刷新浏览器 ...

加了driver.refresh()果然好使,登陆上了
就是剩下的代码,总是爬取不到信息,愁人

isdkz 发表于 2023-3-1 19:20:56

sjjy1813 发表于 2023-3-1 17:18
加了driver.refresh()果然好使,登陆上了
就是剩下的代码,总是爬取不到信息,愁人

你先确定 .ant-tabs-tab:nth-child(2) 这个元素能找得到再说吧

sjjy1813 发表于 2023-3-7 11:22:20

本帖最后由 sjjy1813 于 2023-3-7 11:36 编辑

isdkz 发表于 2023-3-1 19:20
你先确定 .ant-tabs-tab:nth-child(2) 这个元素能找得到再说吧

<table cellspacing="0" cellpadding="0" border="0" class="el-table__body" style="width: 1013px;"><colgroup><col name="el-table_3_column_9" width="516"><col name="el-table_3_column_10" width="120"><col name="el-table_3_column_12" width="120"><col name="el-table_3_column_11" width="257"></colgroup><tbody><tr class="el-table__row"><td rowspan="1" colspan="1" class="el-table_3_column_9"><div class="cell"><!----> <div data-v-01ceff70="" data-v-3cd85bb6="" class="doc-type-icon doc"></div> <span data-v-3cd85bb6="" style="cursor: pointer;">
                            房管局购房协议正文
                        </span></div></td><td rowspan="1" colspan="1" class="el-table_3_column_10 is-center table-status"><div class="cell"><span data-v-3cd85bb6="" class="dot not-pass"></span> <span data-v-3cd85bb6="" style="margin-left: 6px;">未通过</span> <i data-v-3cd85bb6="" class="el-tooltip el-icon-warning-outline" aria-describedby="el-tooltip-2112" tabindex="0"></i></div></td><td rowspan="1" colspan="1" class="el-table_3_column_12 is-center "><div class="cell">8.00</div></td><td rowspan="1" colspan="1" class="el-table_3_column_11 is-center "><div class="cell"><button data-v-3cd85bb6="" type="button" class="el-button el-tooltip el-button--default el-button--mini" aria-describedby="el-tooltip-6024" tabindex="0" style="display: none;"><!----><!----><span>
                              查看原因
                            </span></button> <button data-v-3cd85bb6="" type="button" class="el-button el-tooltip disabled-btn el-button--default el-button--mini" aria-describedby="el-tooltip-6723" tabindex="0" style="display: none;"><!----><!----><span>编辑
                            </span></button> <button data-v-3cd85bb6="" type="button" class="el-button el-button--default el-button--mini" style="display: none;"><!----><!----><span>编辑
                        </span></button> <button data-v-3cd85bb6="" type="button" class="el-button el-button--default el-button--mini"><!----><!----><span>
                            下载
                        </span></button> <button data-v-3cd85bb6="" type="button" class="el-button el-button--default el-button--mini"><!----><!----><span>删除
                        </span></button></div></td></tr><tr class="el-table__row"><td rowspan="1" colspan="1" class="el-table_3_column_9"><div class="cell"><!----> <div data-v-01ceff70="" data-v-3cd85bb6="" class="doc-type-icon doc"></div> <span data-v-3cd85bb6="" style="cursor: pointer;">
这里面想选出所有文件名,及其对应的状态未通过、已上架、未上架、审核中,还有文件编辑、下载、删除,然后查找出操作功能的编辑、删除、下载,接着是筛选未上架、未通过的状态文件,通过删除操作,将其删除,不知道怎么了,代码总是无法执行。

# 使用BeautifulSoup来解析页面
soup = BeautifulSoup(driver.page_source, 'html.parser')

# 查找文件名和状态
file_names = []
statuses = []
for td in soup.find_all('td', {'class': 'el-table_3_column_9'}):
    file_names.append(td.find('span', {'class': 'cell'}).text.strip())
for td in soup.find_all('td', {'class': 'el-table_3_column_10 is-center table-status'}):
    statuses.append(td.find('span', {'class': 'cell'}).text.strip())

# 查找编辑、下载、删除按钮
buttons = {}
for td in soup.find_all('td', {'class': 'el-table_3_column_11 is-center'}):
    button_dict = {}
    for button in td.find_all('button', {'class': 'el-button el-button--default el-button--mini'}):
      button_text = button.find('span').text.strip()
      button_dict = button
    buttons = button_dict

# 筛选状态只有未上架和未通过的文件名,并使用删除按钮
for i, status in enumerate(statuses):
    if status in ['未上架', '未通过']:
      delete_button = buttons['删除']
      delete_button.click()
      # 弹出确认窗口,点击确认
      driver.switch_to.alert.accept()

# 关闭webdriver
driver.quit()

sjjy1813 发表于 2023-3-12 17:47:55

最后和ChatGPT深入交流了一下,完美实现了所有的需求,不得不说,只要把需求给chatgpt说明白了,还真是强大,不但能给代码,还能查错,就是网络不给力,经常断,导致经常输出代码一半了,停止了,大量时间浪费在反复输出结果上
页: [1]
查看完整版本: 想写个脚本,自动删除网页上的文件,总是无法登陆