我有一个可以工作的刮刀,但我无法关闭弹出窗口。而且弹出窗口只在某些情况下出现,所以我需要处理它
我尝试找到一个按钮属性并单击“全部接受”
代码中粗体部分是我尝试过的
import asyncio
from pyppeteer import launch
import time
from datetime import datetime, timedelta
import pandas as pd
async def filter_by_url(url):
browser = await launch(
{
"headless": False,
'args':['--start-maximized'],
# 'executablePath':'/usr/bin/google-chrome'
}
)
# url = "https://www.justwatch.com/us/provider/netflix?sort_by=trending_7_day"
page = await browser.newPage()
await page.setViewport({'width': 1920, 'height': 1080})
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3')
await page.goto(url)
## Scroll To Bottom
**#time.sleep(5)
#await page.waitFor('footer span[data-icon="Accept all"]')
#await page.click('button:has-text("Accept all")');
#await Page.locator('uc-accept-all-button').first().click();**
while True:
await page.evaluate("""{window.scrollBy(0, document.body.scrollHeight);}""")
time.sleep(2)
end_point = await page.querySelector(".timeline__end-of-timeline")
if end_point:
print("reached to end points")
break
# Run the function
urls = [
'https://www.justwatch.com/ca/provider/netflix?sort_by=trending_7_day'
]
for url in urls:
asyncio.get_event_loop().run_until_complete(filter_by_url(url))
你的按钮放在
shadow-root
里面,要获取内部影子根结构,你应该先获取它的主机,然后获取shadowRoot
属性。
影子主机有选择器
#usercentrics-root
。
您应该等待主机内容加载,然后单击内部按钮。如果内容尚未呈现 - 超时后重复。
在此之后,等待主机被隐藏是一个很好的做法。
await page.evaluate("""function acceptConsent() {
let accept = document.querySelector('#usercentrics-root').shadowRoot.querySelector('[data-testid=uc-accept-all-button]');
if(accept) {
accept.click();
return;
}
setTimeout(acceptConsent, 500);
}
""")
await page.waitForSelector('#usercentrics-root', options={'visible': False})