模拟登陆网站出现了问题
这是原代码
from pyppeteer import launch
import asyncio,random
def input_time_random():
return random.randint(100, 150)
async def mains1():
browser = await launch(headless=False, args=['--disable-infobars','--window-size=1920,1080'])
page = await browser.newPage()
await page.setUserAgent(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")
await page.setViewport(viewport={'width': 1536, 'height': 768})
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }')
await page.goto('https://www.douban.com/')
# 位置 参数
await page.type('.text', '13729429803',{'delay': input_time_random()}) # 账号
await page.type('.password', '123456',{'delay': input_time_random()}) # 密码
await page.click('.button', {'timeout': 3000})
print('登录成功')
asyncio.get_event_loop().run_until_complete(mains1())
报错
raise PageError('Cannot find {} on this page'.format(selector))
pyppeteer.errors.PageError: Cannot find .text on this page
错误原因,db网站页面有ifame标签,该标签下的内容为一个独立页面内容,需要绕过该标签才能完整提取
修改代码如下
wait page.goto('https://www.douban.com/')
iframe = page.frames
await iframe[0].xpath('//*[@class="account-tab-account on"]')
# 位置 参数
await iframe[0].xpath('//*[@id="username"]')
await iframe[0].xpath('//*[@id="password"]') # 密码
time.sleep(2)
await iframe[0].xpath('//*[@class="btn btn-account "]')
可以登陆成功
但是如果需要赋值账号密码,还在摸索中,如果有大佬知道怎么弄麻烦告诉我一下^ - ^~
pyppeteer绕过iframe标签比较困难,这里使用selenium比较方便
from selenium import webdriver
class Db():
def __init__(self):
options = webdriver.ChromeOptions()#选择浏览器
options.add_argument('--disable-blink-features=AutomationControlled')
self.browser = webdriver.Chrome(chrome_options=options)
def base(self):
self.browser.get('https://www.douban.com/')#获取dbDevurl
login_iframe = self.browser.find_element_by_xpath('//div[@class="login"]/iframe')#定位iframe
self.browser.switch_to.frame(login_iframe)#转进iframe标签
self.browser.find_element_by_class_name('account-tab-account').click()#定位密码登陆按钮
self.browser.find_element_by_id('username').send_keys('123123123')#定位输入用户名框,并传参
time.sleep(2)
# self.browser.find_element_by_class_name('account-form-input password').click()
self.browser.find_element_by_id('password').send_keys('124123123')#定位密码框,并传参
self.browser.find_element_by_css_selector('div.account-form-field-submit >a').click()#定位登陆按钮
print('登陆成功!')
if __name__=='__main__':
s=Db()#调用Db类
s.base()#调用base函数
结果如图: