方法
常见的爬虫有两种
http 请求 | 模拟浏览器,这里以 playright (各种语言都有)为例子 | |
---|---|---|
优点 | 1.并发量大,资源占用少。 | 1.比较不会被反爬 2.可以处理动态加载的内容 3.可以处理需要登录的情况 |
缺点 | 1.无法处理动态加载的内容 2.需要登录的情况处理的比较麻烦 | 1.单个线程资源占用高,无法高并发 |
Tips
- 及时关闭浏览器(如果是使用无头浏览器的话),可以把获取和解析分开,先获取,然后关闭浏览器,再进行解析。及时释放资源。
反爬
代理池
超时重试
建议和代理池结合使用,如果一个代理失败,就将其从代理池中删除。
验证码动态识别(这种一般是用于自动化、需要账户登录的情况下才使用)
场景解决
任务量大,但是单机效率低
我最近的一个场景是需要爬取的数据约为1kw,但是单个进程的效率被限制在 40s/条 ,一个机器比较合适的并发数是 50 个。
因此我是再写了一个服务端,作为一个任务分发器,每个爬虫都会去这个服务端来取得任务,这样子来提高并发数。
动态加载
一些网页的内容需要 js 或者是后端的动态加载,此处我的方案是使用 playright
通过执行
page.Evaluate("window.scrollTo(0, document.body.scrollHeight);")
来将页面移动到底部等待网络加载完成(如果是动态加载,那么从html 来说是已经停止 load 的,因此等待页面加载是无效的)
当然,你可以两个都写,先等待页面完成加载,再等待网络完成加载
page.WaitForLoadState( playwright.PageWaitForLoadStateOptions{ State: playwright.LoadStateNetworkidle, Timeout: &timeout } )
多次重复操作(有的网页延迟比较高,多来几次比较稳妥)
因为这种操作成功之后基本就不会等待了,因此时间浪费比较少