puppeteer抓取网站时报Navigation Timeout Exceeded: 30000ms exceeded问题

今天看了下数据库中的内容,发现数据对应不上,特查了下爬虫日志,发现了Navigation Timeout Exceeded: 30000ms exceeded这个问题,原本跑着好好的程序又出现问题了。

问题

  1. 自己pc上爬去没有问题。
  2. 服务器上爬取有问题,但是chrome是可以访问被爬网站的(服务器是window server 2008)。
  3. npm包也重装过。

公司内所有出外网的口都是统一的,而且本地和服务器上都可以正常并快速的访问外网,另外服务器的防火墙是关了的。但是服务器上仍是有这个问题,我尝试用增加延迟,120s,240s,都是timeout。

处理方法

后来尝试其他网址,使用百度这种简单页面,发现居然也得好几十秒才能爬取到。当然这也证明了puppteer是可以正常工作的,但是出于某种原因爬去特别慢。

故修改延时到无限大:

await page.goto(url, {
    timeout: 0
});

打印爬取前后时间,发现居然需要将近497秒。。。所以异常还是出现在爬取上,但是线上程序不舍定超时,这是不太现实的,毕竟有那么多内容需要爬。

所以,到底应该不是puppeteer的问题,故缩短每次执行的时间,网络问题总不会一直存在的,其他方法还没想到。

点赞
  1. 我是好人说道:

    两个方法可以解决你的问题:
    1、设置代理
    puppeteer.launch({
    args: [
    '--proxy-server="direct://"',
    '--proxy-bypass-list=*'
    ]
    })

    2、设置浏览器头信息
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
    await page.setExtraHTTPHeaders({
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8'
    });

    以上两种方法均能解决你的问题,亲测有效(机器server2008)

    1. 2fps说道:

      没有代理,所以没有测试一,只尝试了第二种,但服务器上的还是timeout。想问下设置请求头只是为了让被爬方认为这是正常的浏览器请求么?因为我本地pc上是没有问题的。

  2. 匿名说道:

    我知道

  3. 先辈说道:

    巧了,我也遇到了这个奇怪的情况,你现在有任何解决吗 :cry: :cry:

    1. 2fps说道:

      我将延迟扩大到了120s,原本一天跑一次的程序定时成一天跑四次,现在看有几条可以成功获取了,但是大部分的还是timeout,暂时没找到方法,设置过大的超时也不切实际。。。。

发表评论

电子邮件地址不会被公开。