问题遇到的现象和发生背景
我用playwright抓目标网站的视频,抓取逻辑是:
打开视频搜索页面,点击第一个视频(该视频以DIV弹层的形式展现),然后点击下载按钮。 接着点击右侧的箭头 > 翻到下一个视频。
目标网页在点击达到二十来次数后, > 右侧的箭头 > 就会消失,无法再点击。
我想模拟鼠标滚轮动作,向下滚动到相关视频,接着点击第一个视频。
但是我的代码有点问题,滚动的是 DIV弹层背后的内容,而不是DIV弹层本身。导致无法点击DIV弹层下方的相关视频。
请问应该如何修改代码才能随机点击DIV弹层下方的视频?
如图:浏览器右侧有两个垂直滚动条,目前滚动的是最右侧的滚动条,但是我需要滚动内侧的滚动条。
import traceback
from playwright.sync_api import Playwright, sync_playwright
def run(playwright: Playwright) -> None:
try:
i = 0
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(locale='zh-CN')
page = context.new_page()
page.goto("https://www.pexels.com/zh-cn/search/videos/%E7%8B%97/", wait_until="domcontentloaded",
timeout=60000)
print("\n" + page.title())
page.mouse.wheel(0, 200)
#print("\n" + page.content())
# Click video
page.click("video")
# assert page.url == "https://www.pexels.com/zh-cn/video/2796080/"
while (True):
# Click text=收藏点赞免费下载 >> #medium-download-size-selector-toggle-button
page.click("text=收藏点赞免费下载 >> #medium-download-size-selector-toggle-button")
if page.locator("text=全高清").count() >0:
page.click("text=全高清")
elif page.locator("div[role=\"dialog\"] >> text=高清").count() > 0:
page.click("div[role=\"dialog\"] >> text=高清")
else:
page.click("div[role=\"dialog\"] >> text=标清")
raise Exception
try:
#判断弹窗类型
if page.locator(".Modal_close__ToR04.Modal_small__moC54").count() >0:
page.click(".Modal_close__ToR04.Modal_small__moC54") # 关闭弹窗
print("1\t")
elif page.locator("//html/body/div[18]/div/div/div[2]/div[1]/button/svg/use").count() >0 :
page.click("//html/body/div[18]/div/div/div[2]/div[1]/button/svg/use")
print("2\t")
else:
pass
# 点击右侧箭头
if page.locator(".MediumPageInModal_arrow__FiE02.MediumPageInModal_arrowForward__qtu5K .Icon_color-whiteFFFFFF__LjcUS").count() >0:
page.click(".MediumPageInModal_arrow__FiE02.MediumPageInModal_arrowForward__qtu5K .Icon_color-whiteFFFFFF__LjcUS")
print("3\t")
else:
print("4\t")
#page.mouse.wheel(0, 600)
if page.locator("//*[@id=\"-\"]/div[1]/div/div[2]/div[5]/article/a").count() > 0:
print("4.1\t")
#page.click("//*[@id=\"-\"]/div[1]/div/div[1]/div[1]/article/a")
page.click("//*[@id=\"-\"]/div[1]/div/div[2]/div[5]/article/a")
else:
print("4.2\t")
page.mouse.wheel(0, 200)
page.click("//*[@id=\"-\"]/div[1]/div/div[2]/div[5]/article/a")
print("点击下方视频失败")
except Exception as e:
print(e)
traceback.print_exc()
print("5\t")
finally:
if page.locator(".Modal_close__ToR04.Modal_small__moC54").count() > 0:
page.click(".Modal_close__ToR04.Modal_small__moC54") # 关闭弹窗
print("6\t")
elif page.locator("//html/body/div[18]/div/div/div[2]/div[1]/button/svg/use").count() > 0:
page.click("//html/body/div[18]/div/div/div[2]/div[1]/button/svg/use")
print("7\t")
else:
pass
context.close()
browser.close()
except Exception as e:
print(e)
traceback.print_exc()
finally:
pass
with sync_playwright() as playwright:
run(playwright)
运行结果及报错内容
如上
我的解答思路和尝试过的方法
如上
我想要达到的结果
如上