爬虫小记


方法

常见的爬虫有两种

http 请求模拟浏览器,这里以 playright (各种语言都有)为例子
优点1.并发量大,资源占用少。
1.比较不会被反爬
2.可以处理动态加载的内容
3.可以处理需要登录的情况
缺点1.无法处理动态加载的内容
2.需要登录的情况处理的比较麻烦
1.单个线程资源占用高,无法高并发

Tips

  1. 及时关闭浏览器(如果是使用无头浏览器的话),可以把获取和解析分开,先获取,然后关闭浏览器,再进行解析。及时释放资源。

反爬

  1. 代理池

  2. 超时重试

    建议和代理池结合使用,如果一个代理失败,就将其从代理池中删除。

  3. 验证码动态识别(这种一般是用于自动化、需要账户登录的情况下才使用)

场景解决

任务量大,但是单机效率低

我最近的一个场景是需要爬取的数据约为1kw,但是单个进程的效率被限制在 40s/条 ,一个机器比较合适的并发数是 50 个。

因此我是再写了一个服务端,作为一个任务分发器,每个爬虫都会去这个服务端来取得任务,这样子来提高并发数。

动态加载

一些网页的内容需要 js 或者是后端的动态加载,此处我的方案是使用 playright

  1. 通过执行 page.Evaluate("window.scrollTo(0, document.body.scrollHeight);")来将页面移动到底部

  2. 等待网络加载完成(如果是动态加载,那么从html 来说是已经停止 load 的,因此等待页面加载是无效的)

    当然,你可以两个都写,先等待页面完成加载,再等待网络完成加载

    page.WaitForLoadState(
        playwright.PageWaitForLoadStateOptions{
    				State:   playwright.LoadStateNetworkidle,
    				Timeout: &timeout
        }
    )
  3. 多次重复操作(有的网页延迟比较高,多来几次比较稳妥)

    因为这种操作成功之后基本就不会等待了,因此时间浪费比较少


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录