一面结束,总结爬虫的一些小问题,抛砖引玉

2016-04-18 15:59:51 +08:00
 hxndg

上午去面试了腾讯,然后问到了爬虫的问题,结果很多都想不起来了。所以写个帖子总结有关爬虫的种种问题,顺便也方便些其他找实习的同学,第一次笔试没想到会拿到面试,已经很好运了,再攒攒人品。

A 假设,要写一个爬虫,抓取新浪网的数据,那么需要怎样设计?

B 新浪网本身肯定是防爬虫的,那么常见防爬虫的方式有哪些?

C 如果使用 hash 来保证不会出现重复爬取的 url ,如果出现了 hash 碰撞的情况怎么办?

  • 针对问题B,常见网站防止爬虫的基本思路就是爬虫在某些方面比人强,某些方面比人差,因此,如果某些访问请求访问的频率大于某个阈值时,我就可以使用验证码来判断请求发起者是不是人,这一点我用 ss 翻墙的时候经常遇见 google 这么干,当然有的简单验证码是可以通过 python 一个光学识别的包来通过的,北邮教务处登录的验证码就属于这种比较弱的验证码,这种方法最直接的想法是降低请求频率。

针对问题A,首先估测新浪网的数据量,假设每天产生 1000 条新闻,那么单是新闻就是 1000365 条的量,打开新浪可以看到光是分站就是 60 个,整个新浪的 url 量就是 1000365 (天)60 (个分站)15 (年)=4.38*10^8 ,这里我忘了我是什么时候用的新浪,姑且从 2000 年开始计算,认为是 16 年,为方便计算认为是 15 年。新浪的数据只会比它多,而不会比它多,而不会比它少。为此直接的想法时使用多线程爬虫,多个爬虫同时爬取,除了使用多线程还可以使用分布式的大型爬虫,只有这个样子才可能爬完这么多( orz ),然而新浪必然有自己的频率反爬虫机制,因此我们的爬虫还得使用代理(也得限制频率),随着一段时间更换一个代理,降低爬虫被封的危险。 现在又有另外一个问题,我今天爬了一次新浪,存了数据,过了几天接着爬,还要再重新爬取一遍么? http 协议里我记得有个字段是 If-Modified-Since ,同样可以利用这已经缓存过的 url 网址是否改变过,改变了我们再从新爬去,没改变就不用从新爬取了。 会有这种问题,不同平台的爬虫可能会爬取同一个链解,造成资源的浪费,怎么办。这点我想的是某个爬虫必须自己保存已经访问过的 url 网址,同时还得有一个总的索引来保存所有已经访问过 url 网址,这点我直接想到的答案有点类似 dns 轮询了, master 爬虫靠 slave 爬虫爬取不同分站的 url ,当遇到其他分站的 url 时,不去访问,遇到同一个分站的时候先问 master 哪个主机可能存储了这个信息, master 给出另一台 slave 地址,然后我直接去问你访问了没?同时为了节省空间,每个爬虫直接存储 url 的 hash 值,而不是 url 网址。当然这个东西直接引出了问题 C

针对问题C,不同爬虫保存 hash 值,可能会遇见 hash 碰撞的情况,怎样应对这种情况呢?直接想法是在增加存储的信息,考虑的是我如果把 url 和 hash 值存到一起,那我不如直接存 url 呢,所以这个问题我没想到特别好的答案,个人比较觉得中意的想法类似给 url 每个字母在不同位置算加权,构成一个 hash 链,但是也觉得不是很好,这个确实没想到好的答案。期待大神的回复

发现面试还是有点喜欢问你在数据量大的思想下解决问题的能力,所以平时写程序时还是要跳开来看问题,不要被局限。

2393 次点击
所在节点    Python
35 条回复
hxndg
2016-04-18 16:09:03 +08:00
为什么有的 markdown 不能标记,好奇怪
loading
2016-04-18 16:13:04 +08:00
所以,腾讯都是爬虫爬过来的数据。
hxndg
2016-04-18 16:13:21 +08:00
我本身考虑过,先让爬虫把链接分析并整理,然后直接段时间切换代理抓取的方式,但和这个类似。所以就没写
hxndg
2016-04-18 16:13:57 +08:00
@loading e.....我表示我只是简历上写了爬虫,怪我。。。。。
mornlight
2016-04-18 16:26:58 +08:00
A B 问题主要靠经验。
我一直有 C 的疑惑,如果是简单的 url hash ,数据多了之后很容易会碰撞,怎么设计能支撑更多数据的 hash 规则?
feather12315
2016-04-18 16:29:50 +08:00
最后一个是不是在考布隆过滤器?
hxndg
2016-04-18 16:30:31 +08:00
@mornlight 确实,前两个问题经验可以解决,可是上午昏昏欲睡地。。。。。
对于问题 c 我也想不明白,打算去看看分布式爬虫么?
Yc1992
2016-04-18 16:30:57 +08:00
hash 这个问题很有意思,我是直接把头部字段中的所有信息都提取出来用 hash.update 了一下来去重的。
hxndg
2016-04-18 16:35:43 +08:00
@feather12315 orz ,确实,布隆过滤器看了下百科发现确实很有效
qqmishi
2016-04-18 16:39:08 +08:00
有的网站只要不发送验证码就不验证了 23333333 (比如学校的
新浪的直接用 cookie 登录就可以绕过验证码了。
hash 那个可以尝试加个盐?具体的防止方法没怎么考虑过,毕竟个人的小爬虫数据量不是很大。
murmur
2016-04-18 16:46:04 +08:00
@mornlight 碰撞就碰撞呗,那又怎么样,又不是搜索引擎有漏掉必须手动补上的情况,新浪微博产生的数据在日千万级别,还是我上学刚开始的数据,现在早都日亿了,比起 bloomfilter ,你没爬到的数据能有多少能估计到么。。
murmur
2016-04-18 16:47:19 +08:00
B 新浪网本身肯定是防爬虫的,那么常见防爬虫的方式有哪些?
这个问题,新浪微博是冻结账号,必须手机解封,而且一个手机每天只能解封 5 个账号,这也是我读研的时候爬微博碰到的问题
验证码什么都弱爆了,真的
peter999
2016-04-18 16:48:04 +08:00
也是 py 交易(ಡωಡ)
hxndg
2016-04-18 16:50:49 +08:00
@murmur 额,我倒是不知道每个手机解封的数量有限制。。。。验证码弱爆了,这我很赞同。
murmur
2016-04-18 16:54:51 +08:00
另外补充一下,新浪新闻那个不适合作为考点,这种新闻网站他是希望你去爬的,只要别过分,因为有竞争,所以收录的越多越全越好,如果这个问题放到 3 年前答,爬新闻类网站首选他的 RSS ,可惜现在 RSS 用的越来越少,死链一是多二是更新不及时
一声叹息
但是新浪微博不一样,这个东西压根就没想让你爬,他自己有自己的搜索引擎,我们以前做监控的时候,就是用他的站内搜索,新浪微博和新闻不一样,没有固定的信息源,也就是说你不知道一个重要的东西是啥时候冒出来的,所以只能监控重要关键词
新浪微博还一个很恶心一点就是移动端(官方客户端)的乱序时间线,他会随机打乱时间,把以前很老的数据挖出来当新的,貌似 pc 端还是正常的,这个真的没法理解为什么要这么做
以前可以爬微博的移动端,还有一部分人选择盗用 weico 什么的 key 来用,比爬页面容易很多,但是现在第三方微博客户端越来越少,能盗用的 key 也不多了,何况现在应该没什么客户端直接把 key 加密在 app 里吧,应该都是服务端中转一次
mikezhang0515
2016-04-18 17:02:52 +08:00
这是啥岗位啊?
hxndg
2016-04-18 17:12:56 +08:00
@mikezhang0515 后端 c++
sean10
2016-04-18 17:27:52 +08:00
前排收藏学长面经
hxndg
2016-04-18 18:13:53 +08:00
@sean10 噗,面经的话等过段时间 byr 论坛上写一点好了,毕竟腾讯是我投的第一家。。。。才一个的面经太少了。。。。
sean10
2016-04-18 18:32:38 +08:00
@hxndg 好~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/272000

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX