2

我正在尝试从 Python Async 返回 XHR url 列表。下面是我的代码。

import asyncio
from pyppeteer import launch

async def intercept_response(res):
    resourceType = res.request.resourceType
    xhr_list = []
    if resourceType in ['xhr']:
        print(res.request.url)
        xhr_list.append(res.request.url)
    return xhr_list

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    page.on('response', intercept_response)
    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1')
    await page.goto('https://www.iesdouyin.com/share/user/70015326114', waitUntil = 'networkidle2')
    await browser.close()

if __name__ == '__main__':
    url = asyncio.run(main())
    print(url)

但是,当我运行代码时, res.request.url 被打印出来,但没有返回 xhr_list,导致 url 为 None。我的代码有问题吗?

4

1 回答 1

2

您的代码有两个问题。首先,intercept_response尝试构建一个列表,但该列表始终是新创建的,并且始终最多包含一个元素。由于intercept_response被多次调用,它应该附加到同一个列表中。

此外,您需要确保 的返回值intercept_response传播到main,并从那里实际返回。例如,您可以使用def分配给在外部范围中定义的变量的闭包(内部):

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    url = []
    async def intercept_response(res):
        if res.request.resourceType == 'xhr':
            print(res.request.url)
            url.append(res.request.url)
    page.on('response', intercept_response)
    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1')
    await page.goto('https://www.iesdouyin.com/share/user/70015326114', waitUntil = 'networkidle2')
    await browser.close()
    return url
于 2020-05-17T13:30:57.207 回答