关于爬虫的若干问题
最近想利用爬虫去获取较为大量的数据,但是在爬的过程中遇到了若干问题,所以来和各位大神讨教一下,如能解答,感激不尽。 1. 对于网页链接数量较多的时候,用什么方式去爬能提升效率? 我现在是将所有的子页链接存到一个数组里面,在对数组链接map操作,然后去获取每一页的数据。但是我现在所爬到的子页链接有上万个,爬取这些链接需要很长的时间,获取链接之后的请求页面获取数据也要很久的时间。所以我想知道,有没有更好的方式能够提高爬虫的效率的。 2. 获取数据和存储数据应该怎么处理 我在请求子页面获取数据之后,会将数据存储到mongodb里面,但是事实证明,这种写法让我的爬虫存储效率低下,而且经常出现堆栈溢出的情况。所以我想了解一下大神们获取到数据之后是怎么存储数据的,我听过读写分离,但是不知道这具体是怎样的一个概念,有大神讲解下么~ 3. 对于爬到错误数据的处理 有些时候,所爬到页面的数据,是不符合存储标准的,但是我不知道这部分的数据是应该放过,还是重新请求页面重新获取一次。我现在是如果请求到的数据不合格,就会换个ip重新请求页面,知道数据符合为止。但是这样很有可能造成死循环,所以想知道大神们对这种状况的处理方式。 4. 用mongo存储数据的问题 从昨晚到今天,总共有将近7w个子链接,但是我的mongodb里只多了5k条数据。所以我想了解一下,关于mongodb,有没有什么可参考数据之类的,可以让我了解一下它的真实性能。顺便如果有大神肯分享一些mongo使用技巧和心得的话,那就更感谢了。。。 小菜鸟新入门,如果有犯低级错误的地方,欢迎各位大神指正。
1 分段爬取 2,堆栈溢出和mongodb无关,估计是一次爬取太多数据,内存爆了. 3 有次数和超时限制,最终失败后记录日志 4 你暂时不会遇到数据库性能问题,可先不关注.
- 优化单个url抓取的效率。
- 想清楚你要爬的内容,其他多余的动作不要做。尽量少的发请求和load计算
- 缓存已经爬过的url,避免重复爬取
- 分清可以通过重试解决,和重试多少次都解决不了的报错。前者加重试上限次数和超时时间。后者早早退出。
- 不同的网站会有防抓策略和重定向,尽量全面的考虑
- 如果你需要爬的量真那么大,那你就没法一口气把程序全部跑完。方案?比如不再递归,加入存放url的set队列:每次从队列取url,抓完把新分析出的url放入队列,退出。
- 同一楼。另外如果你的ip很多不靠谱的,那就加一定的重试,但你要分清重试有用,而且确定你的请求没有被防抓识别,不然就是浪费子弹,好ip都成了炮灰
- 同一楼。我不觉得你目前能把抓取响应后写db的速度,吃到mongodb的瓶颈,这个缓些考虑吧。容量的话建议你先看看你抓到链接的有效性
祝你好运
@178220709 好的 多谢你的建议
@soda-wy 我原来用递归的 发现太容易堆栈爆炸了。。所以用async改写了 limit限制同时200个请求左右。但是我放到服务器上之火,发现效率很低。。一天也就两千多条数据。。绝望 不管怎么说 感谢你的建议,我先写日志查一下 新年快乐噢~
麻烦问一下,你做爬虫用的是 哪个模块,cheerio 吗? 动态数据如何捕获的?就是首页加载完,用ajax 渲染的数据
@varwx cherrio + puppeteer
@varwx ajax的数据你不是可以直接找相应接口去获取么?
@atian25 puppeteer看起来挺厉害的 请问你一般是怎么用的?
@atian25 好的,明白了,非常感谢
@zzuzsj 这个直接从接口拿数据,跟爬虫就没有什么关系了吧