我写了一个简单的程序,它只记录请求和响应,一次是在 Python 中使用 pyppeteer,一次是在 JavaScript 中使用 puppeteer(在遇到问题后我将描述下一个)。这是JS代码:
const puppeteer = require('puppeteer');
const url = 'https://www.twitch.tv/';
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', request => {
console.log("REQUEST: " + request.url());
request.continue();
});
page.on('response', response => {
console.log("RESPONSE: " + response.url());
});
await page.goto(url, {waitUntil: ["networkidle0", "domcontentloaded"]});
await browser.close();
})();
这是Python代码:
import asyncio
from pyppeteer import launch
url = "https://www.twitch.tv/"
async def handle_request(request):
print("REQUEST: ", request.url)
await request.continue_()
async def handle_response(response):
print("RESPONSE: ", response.url)
async def main():
browser = await launch()
page = await browser.newPage()
await page.setRequestInterception(True)
page.on('response', handle_response)
page.on('request', handle_request)
await page.goto(url, waitUntil=["networkidle0", "domcontentloaded"])
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
然后我使用以下方法比较它们的输出:
> python3 script.py | grep "wasm"
REQUEST: https://static.twitchcdn.net/assets/wasmworker.min-[redacted].js
REQUEST: https://static.twitchcdn.net/assets/wasmworker.min-[redacted].wasm
> node script.js | grep "wasm"
(nothing)
我的问题:
(1) 为什么我得到不同的结果?Puppeteer 和 Pyppeteer 不应该在后台使用完全相同的浏览器,并且(希望)使用相同的默认设置(例如视口......等)吗?
(2) 即使 Python 版本工作得更好(主观上,对于我的用例),因为它记录请求,为什么它不记录相应的响应?在非无头模式下运行时,在开发人员控制台中,两个请求都将显示响应代码 200。什么可能导致响应没有被 pyppeteer 记录?
我尝试使用不同的视口大小并启用/禁用缓存,但无济于事。
编辑:好的,(1)的原因似乎是 pyppeteer 刚刚过时。关于(2): twitch.tv 在使用 puppeteer 运行时不提供我正在寻找的文件(而且流也不起作用);尽管我将 puppeteer 设置为使用与手动访问页面时相同的 chrome 可执行文件和 UserAgent 字符串,但它可以在其中工作。我认为这可能与 puppeteer 禁用扩展有关,因为调试控制台显示cast_sender.js
来自 chrome cast 扩展的一些错误,但即使使用确切的 saame 参数启动 chrome,因为 puppeteer 确实加载了感兴趣的文件。