记录网页爬虫注意的几个问题

能随意地收集大量的信息是作为程序员一个酷炫的技能之一。他们谙习这些二进制存储和流通,不管是处于正义还是邪恶的目的,这些公开或者半公开的数据对于他们来说唾手可得!是不是有大片开场的画面感!!当然我是遵纪守法的好公民,最近需要抓取某个站点的公开数据,结合以前爬取的一些经验做个总结。

前言

能随意地收集大量的信息是作为程序员一个酷炫的技能之一。他们谙习这些二进制存储和流通,不管是处于正义还是邪恶的目的,这些公开或者半公开的数据对于他们来说唾手可得!是不是有大片开场的画面感!!当然我是遵纪守法的好公民,最近需要抓取某个站点的公开数据,结合以前爬取的一些经验做个总结。

设置合理的user-agent

一些站点会把这个当作很基本的过滤条件,我们就不碰壁了,直接找个浏览器粘贴一个,有些文章介绍用一些爬虫的user-agent,但是对方可能会有相关的爬虫服务器的 iplist,不过这种情况不多见,可以试一下。

设置合理的爬取间隔

过于频繁的流量很容易被监控到,当然除了一些没人管的站点,通常请求ip会被对方禁用一段时间,严重的可能会拉入黑名单,这就浪费掉一个 ip 地址了。如果你不是很急的话,我一般设置个 1 到 10 秒的随机访问间隔,单线程执行,慢慢爬。一般来说很多站点都能接受这样的方式,也不会给对方运维人员造成压力,如果还有限制同个 ip 的访问次数,那我们还有代理招。

需要登录权限

有登录就有注册,以前很多注册是需要验证邮箱,通过SMTP协议读取邮件内容实现自动化是个思路,前提你也要有很多邮箱地址,牛逼的你可以自己搭建个邮件服务器,要多少有多少。现在很多是通过手机号码的验证码了,这个就麻烦了,首先要有很多设备插很多sim卡接收短信,然后还要在这些设备上把数据传到你运行的那台机子解析出验证码才能把整个流程自动化。反正我是没试过,一般我都是手工注册几个。

登录的话就会简单一些,把用户名和密码post上去之后根据服务端返回的Set-Cookie设置好相关请求头就行了,甚至有些框架都帮你处理好了。如果需要验证码的话,出门左拐去购买破解验证码的接口或者自己实现吧,拿到凭证后就可以在相关页面里面横冲直撞了。当然,你也可以像我一样手动在浏览器上登录,拿到Set-Cookie之后在进行后面的操作。

增量爬取

如果爬的内容非常多,你永远也不知道在什么时候就 GameOver 了,因此一定要保存好你的进度,通常来说抓取工作都很重,抓到半天然后从头开始,It sucks ! 多写一点代码换来的好处是值得的。

代理魔法好

关于拉内容,这里介绍的是终极大招了。有了代理服务器,你就相当于找到了多个帮你干活的小弟,而且还是远程指挥,被封了也不会影响到你的本尊。

代理的来源:你可以自己用工具去扫描全网找到可用的免费代理,也可以像笔者一样偷懒去购买一些可用的代理。

代理的使用策略:你可能拥有了便宜甚至免费的代理地址,但是这里面很多可能都没法使用,或者现在能用,待会就不能用了,因此在使用之前应该测试一下,及时移除不能用的地址,提高效率。另外,注意不要用一个代理地址连续范围,笔者的策略一般是每个请求顺序换一个代理地址,如果数量足够多的前提下,你可以尽可能地提升你的爬取线程或者进程数,由于每个 ip 的访问间隔足够长,这样也不会被封 ip 。

内容解析

在没认识Jsoup之前,笔者一般通过正则表达式和字符串的处理来滤出想要的内容,如果你还在拼难写的正则表达式,不妨可以试一下 Jsoup 。

Ajax异步内容

现在很多单页的应用都是先把 js 和基本的页面框架先加载,然后在异步请求一些其他的内容,比如很多的下拉到底部请求下一页的列表数据。对于这样的情况,我建议还是读一下它的 js 代码,然后模拟这个过程,这样爬取效率会更高一些;另外也可以selenium这样的工具来模拟浏览器的执行,这个笔者还没用过。

总结

抓取信息其实是个攻与防的过程,总结规律,多测试和践行你的想法,找到合适的策略。最后,善用工具,但行好事哈~

参考

  1. java 爬虫框架:webmagic
  2. html解析框架:jsoup
坚持原创分享,您的支持将鼓励我继续创作!