低价建设网站,网页小游戏插件不支持,温州网站建设优化公司,做网站后期需要什么费用前两天朋友发给我了一篇文章#xff0c;是携程网反爬虫组的技术经理写的#xff0c;大概讲的是如何用他的超高智商通过#xff08;挑衅、怜悯、嘲讽、猥琐#xff09;的方式来完美碾压爬虫开发者。今天我就先带大家开发一个最简单低端的爬虫#xff0c;突破携程网超高智商…前两天朋友发给我了一篇文章是携程网反爬虫组的技术经理写的大概讲的是如何用他的超高智商通过挑衅、怜悯、嘲讽、猥琐的方式来完美碾压爬虫开发者。今天我就先带大家开发一个最简单低端的爬虫突破携程网超高智商的反爬虫技术。
一、什么是爬虫
很多人说我们这些搞软件的人总喜欢把虚拟世界里的事物跟现实中的东西扯上关系。这点我真不否认脱离了现实我们伟大的创举还有何意义
“爬虫”就是个例子它对于我们开发人员而言就是一段用来自动化采集网站数据的程序结果跟现实中的虫子扯上了关系。听说是Google工程师提出来的有质疑请联系Larry Page。 二、为什么需要开发爬虫
在这个数据横流的互联网时代创业型公司如雨后春笋般的崛起而大数据则可以帮他们迅速生产垂直化数据资料库提供给用户使用。同时也让老板们更容易看清未来的方向制定发展策略。
这些大数据从哪儿能弄来呢当然是从每个行业里的龙头老大那里做老大就是这么不容易。这图里一部分是行业老大有些我也没听说过仅供参考 京东的价格、携程的评论、亚马逊的书、淘宝的信用、支付宝的订单等。这些数据采集下来都很庞大那究竟要这些数据有什么用呢
直接用于机器学习分析用户的兴趣爱好和行为。获取淘宝店铺信用直接用于新平台的用户信用及身份验证。获取各个商城物品价格为用户提供市场场最低价。获取酒店、图书的价格、简介、评论做垂直化平台的基础数据库。 请原谅我用携程举例设想我们要做一个高端的垂直化酒店平台就拿北京来说酒店接近10000家。要是全部都手动筛选、录入这些信息需要花费的人力、时间是极其恐怖的事。当然最难的应该是将人工搜集的数据标准化。怎样才能把携程网的酒店数据弄下来作为我们的基础资料库呢
如果利用爬虫技术事情就有了很好解决方案。我们只需要编写一个7*24小时运行的分布式爬虫自动化采集携程网酒店数据将国内外所有高端酒店图片、简介、评分、用户评论全部抓取下来。再通过数据清洗使内容标准化让这些数据成为我们的基础资料库就行了。看到这里内心是不是已经有点小激动
三、开发爬虫需要哪些技术
由此可见爬虫技术已经成为我们每个开发人员最基本的技能同时也是步入中高级开发不得不涉足的内容。为什么这么说呢因为开发一个像样的爬虫需要你了解的东西还真不少
学习任意一门开发语言C#、NodeJs、Python、Java、C。学习网页前端脚本语言Javascript、HTML、CSS。学习HTTP协议、正则表达式、数据库、代理切换等相关知识。学习多线程并发抓取、任务调度、消息队列、分布式爬虫、图像识别、模拟键鼠、NoSql。 我仿佛看到了你一脸懵懂的表情你真的没有看错这些技术只是冰山一角。不过也不用担心初中级的爬虫只需要学会前三点就可以了。要想开发出更高级的爬虫第四点是必须会的同时为了追求极致的性能还需要研究开源浏览器内核的相关项目此处暂省略十万字。
四、开发一个最简单的爬虫
下面我用C#.NET来写一个非常简单的爬虫我们的爬虫之所以被封杀肯定是因为对方找到了运行特征。因此只需要修改爬虫的运行方式及特征让其操作与普通用户的相似就可以了。一般爬虫会有哪些特征和运行方式呢
User-Agent主要用来将我们的爬虫伪装成浏览器。Cookie主要用来保存爬虫的登录状态。连接数主要用来限制单台机器与服务端的连接数量。代理IP主要用来伪装请求地址提高单机并发数量。 通常来说只要我们控制好了上面这4个东西反爬虫组那边就较难找到我们的运行特征。还是拿携程网来举个例子抓取他们的酒店数据因为这些酒店信息本身属于公开的内容我们也不用于商业运作的目的只是为了想见识一下他们反爬虫经理所描述的猥琐程度。
爬虫工作的方式可以归纳为两种深度优先、广度优先。
深度优先就是一个连接一个连接的向内爬处理完成后再换一下一个连接这种方式对于我们来说缺点很明显。广度优先就是一层一层的处理非常适合利用多线程并发技术来高效处理因此我们也用广度优先的抓取方式。
首先我们用Visual Studio 2015创建一个控制台程序定义一个简单的SimpleCrawler类里面只包含几个简单的事件 接着我们创建一个OnStart的事件对象 然后我们创建一个OnCompleted事件对象 最后我们再给它增加一个异步方法通过User-Agent将爬虫伪装成了Chrome浏览器代码中每行我基本都加了注释学过.NET的朋友一看就明白这里就不再重复解释了 就如你所见一个支持并发执行、可伪装成Chrome浏览器、支持Cookie状态保存、支持代理切换的简单爬虫就完成了。
为了加快爬虫的速度我又增加了Gzip解压缩的功能由于不太便于截图大家可以在源代码里查看。现在我们用这个爬虫抓取一下携程网的酒店数据看看效果如何。
携程的酒店是按城市归类的从每个城市又链接到了下属所有酒店国内的城市大约有300多个仅北京一个市的酒店数据就有9000多个所以我要先抓下边这页面里的城市名称及城市URL地址。
在控制台里写下爬虫的抓取代码
代码都很简单眼睛犀利的朋友肯定看到了我在cityCrawler.Start()方法中使用了代理服务器那个参数是可选的。经测试代理IP的速度还不错唯一不足的地方可能就是偶尔会出现连接超时并发量少时并不需要开代理这里只是为了测试的需要。来看看执行情况 由上图可见我们抓到了城市列表页面的源代码但这并不是我们需要的数据我们只想要规规矩矩的城市名称和URL地址。
怎么办呢现在请出《正则表达式》—又简洁又高效的神器就是学起来比较费劲。我写了个提取城市名称及URL的正则表达式直接提取源代码中所有符合规则的数据
a[^]href*(?href/hotel/[^\s])\s*[^]*(?text(?!.*img).*?)/a
在控制台程序中增加正则表达式过滤数据 再次运行爬虫看看是否是我们需要的内容 运行状态良好成功拿到了城市名称及城市URL地址每个城市的URL中都包含了该城市的所有酒店现在我们就根据城市URL抓取下属的酒店列表就拿最后一个城市来试试吧我就不贴代码了同样是先抓取源代码再使用正则表达式清洗数据
a[^]href*(?href/hotel/[^\s])\s*data-dopost[^]*span[^].*?/span(?text.*?)/a
请原谅我写出这无比糟糕的正则表达式看看它的运行结果 这里我发现一个有趣的地方携程网酒店列表页中的连接在点击后会发生变化会自动拼接上一个当天的日期应该是用javascript写的事件。我测试了下这些URL都能正确的连接到酒店介绍页如果这算是他们的反爬虫手段大家也可以在下一篇高级爬虫知识里找到解决方案。
下面写个多爬虫并发抓取的例子代码也非常简单随便写两个酒店URL地址通过Parallel实现2个爬虫的并发抓取。 注意单个IP并发数量不要设置太多短时间内发送大量的爬虫请求很容易被反爬虫组轻易的识别出来因为普通用户不可能在一秒内有那么多的请求和连接。
我们想要提高并发数量怎么办呢当然是使用代理IP和VPN假设反爬虫组限制单台IP连接数不能超过50那我们增加一个代理IP就相当于可以多并发50个爬虫出去在带宽足够的情况下10个有效的代理IP就可以让爬虫的性能提到一个新的高度有没有感觉到大数据已经在向你招手 有人说代理也可以被检测出来那是因为你还不太了解代理代理服务器有很多种而且真有不能被检测出来的代理比如自己搭建的 shadowsocks 这块内容较多将在下一篇高级爬虫的文章详细讲解它的运行方式如下 现在大家就可以利用这个简单的爬虫自由发挥了试试从酒店列表里抓取每个酒店的评分、名称、图片不要太难为自己毕竟这只是一个最简单的爬虫抓取都是同样的原理我就不再多说。
明天发下一篇绝对干货基于C#.NET的高端智能化网络爬虫二主要讲如何开发浏览器内核的高级爬虫、如何执行Javascript、如何操作Dom结构、如何搞定加密代理、如何实现分布式等功能。
然后我们通过这个高级爬虫实现对携程网Ajax评论数据的抓取这次我们就抓取他们的酒店评论。希望大家订阅“全栈解密”千万不要错过哦
全部源代码下载https://github.com/coldicelion/Simple-Web-Crawler
原文地址http://www.toutiao.com/a6304503113106555138/.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注