我想爬取qq音乐的音乐网址,但当我把headless设为True时,程序就会报一下错误:
video_link = await video_link.getProperty('src')
AttributeError: 'NoneType' object has no attribute 'getProperty'
在headless=False时可以运行。
请问可以用什么方法解决呢?
# 导入asyncio模块
import asyncio
# 导入pyppeteer
import pyppeteer
import win32gui, win32con
# 使用async关键字定义异步函数:
from pyppeteer_stealth import stealth
async def main(url,song):
# 打开浏览器
browser = await pyppeteer.launch(
headless=True,
# 设置浏览器界面尺寸
args=['--window-size=1366,768'],
# 设置页面尺寸
defaultViewport={'width': 1366, 'height': 688}
)
page = await browser.newPage()
await stealth(page)
await page.goto(url)
await asyncio.sleep(2)
await page.click('.icon_search.sprite')
pages = await browser.pages()
page = pages[-1]
await asyncio.sleep(2)
await page.click('.yqq-dialog-close')
await page.click('.yqq-dialog-close')
await asyncio.sleep(2)
await page.click('.search_input__input')
await page.keyboard.down('Control');
await page.keyboard.press('KeyA');
await page.keyboard.up('Control');
await page.keyboard.press('Backspace');
await asyncio.sleep(2)
await page.type('.search_input__input',song)
await asyncio.sleep(2)
await page.click('.search_input__input')
await page.click('.search_result__link')
await asyncio.sleep(2)
pages = await browser.pages()
page = pages[-1]
await page.click('.mod_btn_green')
await asyncio.sleep(3)
pages = await browser.pages()
page = pages[-1]
global video_link
video_link = await page.querySelector('body > audio')
video_link = await video_link.getProperty('src')
video_link = await video_link.jsonValue()
await browser.close()
url = "https://y.qq.com/"
song=input()
# 使用get_event_loop()创建异步事件循环
loop = asyncio.get_event_loop()
# 使用run_until_complete()运行异步事件循环
loop.run_until_complete(main(url,song))
print(video_link)
# 关闭异步事件循环
loop.close()
以下内容引用自GPT,有用望采纳:
在你的代码中,当将headless
设置为True
时,程序报错AttributeError: 'NoneType' object has no attribute 'getProperty'
。这个错误是由于在以下代码行中,video_link
的值为None
,无法调用getProperty
方法:
video_link = await video_link.getProperty('src')
这可能是因为在使用page.querySelector('body > audio')
时,无法找到对应的元素导致的。当headless
设置为False
时,程序能够运行,这可能是因为在可视化界面下,元素能够被正确地加载和获取。
解决这个问题的方法是,调试代码,确认所选的音频元素是否正确。你可以使用page.evaluate
方法来执行JavaScript代码,以检查页面上的元素。
修改以下代码行:
video_link = await page.querySelector('body > audio')
为:
video_link = await page.querySelector('audio')
上述代码使用了更简单的选择器来定位<audio>
元素。如果元素被正确地选择,则可以继续执行后续的操作。
另外,建议在等待页面加载完成后再执行操作,而不是使用固定的等待时间。可以使用page.waitForSelector
等方法,根据具体的元素选择器等待元素的出现。
希望以上解释能帮助到你,如果还有其他问题,请随时提问。