从写nodejs的第一个爬虫开始陆陆续续写了好几个爬虫,从爬拉勾网上的职位信息到爬豆瓣上的租房帖子,再到去爬知乎上的妹子照片什么的,爬虫为我打开了一扇又一扇新世界的大门。除了涨了很多姿势之外,与网管斗智斗勇也是一个比较有意思的事情。虽然很多东西都是浅尝辄止,但万事都有个由浅入深的过程嘛(天真脸~~)

一只爬虫的模样

爬虫?应该是长这样的吧:

其实,没有那么萌啦。

所谓爬虫,就是把目标网站的信息收集起来的一种工具。基本流程跟人访问网站是一样的,打开链接>>获取信息>>打开链接……这个循环用编程实现,就是爬虫了。专业一点的说法就是,发起请求>>解析响应数据。普通网站访问的时候,返回值是一个html文本,这时候需要解析html文本获取所需信息,比如可以用cheerio这种类jQuery的操作dom的方式去解析html文本;而使用ajax动态生成内容的网站,可以直接去请求相应的接口,从而直接获得数据。爬虫爬的,就是这些url或者接口,慢慢地爬呀爬,直到世界尽头~~~

爬虫与网管

获取信息是爬虫的核心,但是最有技术含量的却不在于此。爬虫路上的第一个大敌,就是网管了。由于太多人利用爬虫去剽窃别人的成果,所以爬虫在生产内容的网站都不受待见。就想农民伯伯辛辛苦苦种大的大白菜,自然是不希望被猪拱了。网管叔叔们通常会根据爬虫的特征来辨别爬虫,大体上有这么几个方面:

1) 检查请求头。一些很初级的爬虫只是单纯得发请求,连最基本的user agent之类的请求头都没有,看见这种请求,不用说也知道是爬虫了。除了user agent,Referer也是一个通常被用来检查爬虫的字段。

2) 判断用户行为。很多网站在未登录状态的时候会经常返回登录页面让用户登录,用户登录之后通过统计用户访问行为就可以判断出用户是不是人,比如在短时间内进行了大量的访问,这显然不是人力所能做到的了。

3) 判断IP的访问量。如果一个ip在短时间内进行了大量的访问,显然,这也不是人干的事。尤其是同一IP出现高并发的情况,这种会加重服务器负荷甚至搞垮服务器的爬虫,绝对是网管的眼中钉肉中刺。

4) 根据浏览器行为判断。浏览器在打开网页的时候会自动将网页中的图片、css、js等资源加载下来,但是爬虫却只是获取了网页的文本,并不会自动加载相关的资源,通过这一特征也能很好区分爬虫。比如说在网页中加入一个会自动发请求的js文件,服务器端如果接收不到这个请求就可以认为是爬虫在访问了。但是这招对利用浏览器内核写成的爬虫或者是高级爬虫来说就不管用了。

通常网管们比较常用的是就是前3种方式的组合,第4点需要开发改动前后端代码,这对身为运维的网管叔叔们来说,给开发提需求可不容易啊。 但如果在开发阶段就已经考虑到防火防盗防爬虫的话,那就会对接口进行加密或是校验了。虽然说前端代码都是裸奔的,但是假如有意去混淆js的话,想要破解出加密算法也不是那么简单的。校验就跟普通的应付csrf攻击的做法也相差无几,在页面中嵌入服务器端返回的随机数,接口调用时校验这个随机数即可。

智斗网管

但是俗话说,你有张良计,我有过墙梯。 即使网管叔叔好像做了很多反爬虫的工作,但是人民群众的智商是无限的。

什么,你要检查请求头?你要什么样的header,我这里都有!根据IP判断?花几十块买了一堆高匿代理服务器呢。判断用户行为?呵呵,我有一堆小号呀~

具体来说:

1)伪造header。这实在太简单了,随便打开一个浏览器F12,把请求的header都复制一遍,不要太完整哦。

2)多用户爬虫。提前注册好一堆小号,登录之后F12分析cookie,找出账号相关的cookie,将cookie按账号存到数组中不断轮换即可。在有csrf防御策略的网站上,还需要分析token的来源,在请求的时候带上预埋的token即可。例如知乎就在网页中预埋了一个_xsrf,在请求的时候要带上这个自定义头才可以获得请求的权限。

3)多IP爬虫。这个就稍微复杂一些,主要是高匿代理IP比较难搞到手。网上的免费代理不少,能用的不多。要么掏钱,要么就做一个爬虫来爬取可用的代理服务器吧。

4)接口参数解密。这种情况下,参数被加密成一个密码字符串,服务器端通过解密算法来还原参数,也就是说每次请求的参数都是不同的。这里的关键在于找到加密算法和钥匙,而前端的js通常也会被混淆加密,所以这种情况是最复杂的。目前我还没遇到这种情况,所以就不多说了。

一只爬虫的修养

如果一只爬虫动不动就几百个并发,这吃相就难看了。所以我们通常会控制一下并发和爬取间隔,尽量不干扰服务器的正常运转。这就是一只爬虫的修养了。

流程控制方面你可以使用集成的async库,也可以手动管理流程,时刻考虑异常情况就可以写出最贴合你要求的控制流程了。现在es7从语言上加入了async、await语法糖,手动编码的代码也非常优雅了。

附录

1)知乎图片爬虫 :这个是受不了一个曾经很火的帖子诱惑而写的,这个爬虫可以爬取任一话题下所有回答中的图片并下载到本地目录下,你们感受下:

如你所见,大部分妹子长得并没有很好看。。。。(心酸泪奔)

但是!质量不行,我还有数量呀: 

其实并不是很有动力写这种爬虫,不过看到答案中一个家伙写了一个爬虫,但是却只能爬第一页。。。这是什么感觉?就好像是拉链还没拉下来,片子却播完了!忍不住,就写了一个可以下载所有答案的爬虫,然后还用数据库和json两种方式储存了一下数据。刚看的数据库,学以致用!源码和相应说明均在文后有给出。

2)豆瓣小组爬虫: 这个是我在豆瓣上找房子的时候写的简单爬虫,这个爬虫的吃相比较难看!。!因为没有控制并发。。。因为租房帖子的更新非常快,所以就爬取了最新的10页(250条)帖子,主要逻辑就是对标题进行关键词的筛选,将符合条件的帖子输出到网页中(这里用json文件来示范了)。结果大概长这个样子:

3)拉勾网爬虫: 这个是在换工作的时候写的一个很简单的爬虫,主要是想统计一下不同岗位的需求情况、公司分布,本来还想要结合地图做分布图、热力图什么的,最后也是不了了之。只是简单地用echart做了一个图表就完事了,太简陋!拉钩是ajax接口返回数据的,而且没有加密,实在是太好爬了!反爬虫的策略是基于IP的,单个ip访问频繁就会被封哦,要注意!

那些年我们写过的爬虫相关推荐

  1. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  2. php和python写爬虫-一个简单的Python写的XML爬虫

    一个简单的Python写的XML爬虫 来源:程序员人生 发布时间:2013-11-06 16:22:29 阅读次数:1578次 原理很简单,读XML结构,返回值,判断,根据返回的值得到下一个XML的地 ...

  3. python爬虫都能干什么用_5 行代码就能写一个 Python 爬虫

    欢迎关注我的公众号:第2大脑,或者博客:高级农民工,阅读体验更好. 摘要:5 行代码就能写一个 Python 爬虫. 如果你是比较早关注我的话,会发现我此前的大部分文章都是在写 Python 爬虫,前 ...

  4. python简单爬虫代码-python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息...

    原标题:python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息 最近经常有人问我,明明看着教程写个爬虫很简单,但是自己上手的时候就麻爪了...那么今天就给刚开始学习爬虫的同学,分享一下怎么一步 ...

  5. python网络爬虫程序_Python写的网络爬虫程序(很简单)

    Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现 ...

  6. 用c语言写一个网络爬虫

    (同步个人博客 http://sxysxy.org/blogs/28 到csdn 写一个网络爬虫 写一个网络爬虫,来获取一个网站上感兴趣的信息. 最基本的模型 就是图.每个页面看作一个节点,若页面A有 ...

  7. 【直播】手把手带你 5 分钟写一个小爬虫,从入门到超神!

    在程序员界流传着这么一个顺口溜:爬虫玩得好,监狱进得早.数据玩得溜,牢饭吃个够--时不时还有 "XX 公司做违法爬虫,程序员坐牢" 的新闻爆出. 在看热闹的同时,很多人都会提出疑问 ...

  8. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 1

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  9. 从0开始写一个多线程爬虫(2)

    上一篇文章: 从0开始写一个多线程爬虫(1) 我们用继承Thread类的方式来改造多线程爬虫,其实主要就是把上一篇文章的代码写到线程类的run方法中,代码如下: import re import re ...

最新文章

  1. 完整计算机组成系统,计算机组成原理与完整系统结构.doc
  2. 华擎b365m itx 黑苹果_迷你ITX小机箱装机实录,黑苹果首选
  3. 基于Mac自带nginx、php,配置php服务器
  4. [j2me]手机也可以玩播客(Podcast)! Geek开发说明[开源]
  5. SAP Spartacus PageMetaResolver 的单元测试
  6. 交通违章处理的一般程序
  7. sql azure 语法_什么是Azure SQL Cosmos DB?
  8. 实时数据库中的二级压缩技术
  9. Web渗透测试实战:基于Metasploit 5.0
  10. 联想微型计算机的摄像头驱动,Lenovo EasyCamera 联想摄像头驱动
  11. 019-zabbix数据库表详解
  12. 到底有多少种病毒?科学家们分析了100多种SARS-CoV-2变种的功能
  13. 文件下载之断点续传(客户端与服务端的实现)
  14. java int相除向上取整_JAVA入门第一季学习补充 - 何以解忧?
  15. 爱快iKuai 安装成功后运行提示程序运行中解决办法
  16. Android刷windows 10系统,无处不在!安卓手机能刷 Win10 系统了
  17. Python 机器人学习手册:6~10
  18. 第八周编程题在线测试
  19. 【小程序自定义组件,冒泡,自定义导航栏,页面栈】
  20. 发表论文被拒?只因你没注意这几点

热门文章

  1. 爬取steam上热门游戏的价格,网址,评价数据
  2. mac qq电话时其他媒体声音变小
  3. winform皮肤控件【皮肤文件使用及错误解决办法】
  4. 假期不能出门,深度学习和TensorFlow助您去世界各地到此一游
  5. P22-c++自己设计一个队列
  6. 第一次写BP神经网络,求指点【哭脸】
  7. 在虚拟机的CentOS系统下安装pycharm的用户须知
  8. 第九百四十一章令人错愕的真相!
  9. Elasticsearch(ES6)------(5)kibana的es查询、mysql查询转换和对应javaAPI使用(一)
  10. 2017年5月7日 星期日 --出埃及记 Exodus 25:35