集团主站
欢迎来到成都达内官方网站!达内—美国上市公司 亿元级外企IT培训企业!
成都it培训哪家好
成都it培训哪家好
全国服务监督电话:15023458194  |   联系客服   |
当前位置:主页 > 培训课程 > Python >

成都爬虫工程师工资实战:分享工作中总结的爬虫经验

发布者: 成都达内     浏览次数:     发布时间:2019-08-09 11:05:59

1.刚开始写脚本的时候经常忘记带 request headers,特别是host和user-agent这俩个字段(通常带这两个就足够了),这个就是体现在对http协议理解不够...

  今天主要是说说工作中遇到的:

  1.各类反爬虫

  2.一些小技巧

  3.我自己常用的爬虫框架4.分享搭建一个简单的代理池

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  好了,进入正题。

  首先是各类反爬虫和小技巧,我穿插着讲,好的,容我想想列一个表。

  1.刚开始写脚本的时候经常忘记带 request headers,特别是host和user-agent这俩个字段(通常带这两个就足够了),这个就是体现在对http协议理解不够。具体是哪个网站我忘了,我因为没有带上ua,一直拿不到html,耽搁我不少的时间。

  因为网站会检查你的 request headers 中的host,如果不对,好的你拿不到数据,然后是检测你的ua,嗯?什么是ua,就是User-Agent,不同的浏览器有不同的ua,也是爬虫伪装浏览器的第一步。

  2.关于cookies,这个我就遇到过一次,也是我上一份工作中遇到的,我要拿数据的那个网站,分析了url,确定了参数,post过去,嗯?怎么是空网页,数据喃。

  这里我们在用浏览器的开发者工具时,在network里要关注所出现的各种url。后来我注意到在每次post后还有一个url紧跟着请求,原来这个post请求数据是个障眼法。

  所以呢,这个就是网站通过post请求把参数放到cookies里,然后到了真正出数据的url里,在请求时带上刚刚的cookies,服务器在读取完cookies接着就能看到数据了。

  3.接下来就是ip的访问频率了。

  我在入职现在这份工作时,老大让我在xx网抓一份全国的旅行社数据,结果我的ip被ban,整个公司那一周都不能上那网站。所以,当我给老大汇报这个事情的时候,老大淡淡说了句,你当人家网站的运维chishi的么。

  同时,在这里作为一名爬虫工程师,基本的职业素养就包括,好比隔壁组坐着一个漂亮的菇凉,咱们看看就好了,不要去影响人家。所以说,在每两次请求间一定要有时延。这里我不是说,咱们通过测试来摸索出该网站的rps(request per second),然后就着rps来跑,这样的确算是提高效率的方法,但是我偷懒,统一设置为10秒的时延。

  但是,处理办法有好几种。

  一,每一次请求时变更ua,就可以理解为学校机房里,大家同时访问一个url,难不成就把这个机房的ip给ban了?

  二,在request headers里带上 referer,既然是模拟人的操作,那就在每一次请求的headers的referer里带上上一次的请求url。什么?referer是做什么的,这个就是告诉服务器我是从哪一个url来到哪一个url去。

  三, 设置时延,这个不解释,我们抓数据的同时不能给服务器造成太大压力,也不能影响别人的浏览体验。

  四,使用代理, 通过改变代理ip的方式,让服务器没办法来阻止你拿数据。4. 放在js中的反爬虫,这里我很愿意来举一个实际的栗子。客官们可以跟着我一起来看看人家怎么反爬虫的。

  就说携程酒店的评论数据好了。

  http://link.zhihu.com/?target=http%3A//hotels.ctrip.com/

  然后随便点一个酒店进去,“shift+ctrl+i” 打开开发者工具

  然后拖动页面去找评论,点击 更多评论, 这时候注意开发者工具里的network里的变化。

  然后能看到这两个

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  可以看到,我画圈的就是关键,而下面那个AjaxHotelComment。是请求评论的页面,因为在请求这个ajax时里面有个参数eleven,看似是个token,实际不符合token的定义,总之就是在这个ajax请求前通过oceanball?这个请求得到一个eleven参数,然后交给请求ajax得到数据。

  现在我们点进去那个画圈的url,复制开一个新窗口打开。整理后的代码长这个样子

  eval(function(arr, f) {

  if (typeof Array.prototype.map === "function") {

  return arr.map(f)

  }

  var res = [],

  j = 0;

  for (var i = 0,

  l = arr.length; i < l; i++) {

  res[j++] = f(arr[i], i, arr)

  }

  return res

  } ([.....],

  function(item) {

  return String.fromCharCode(item - 38644)

  eval这个臭名昭著效率低的东西恰巧就是反爬虫利器,我们可以看到这段代码实际起作用的内容就是

  arr.map(f)

  好的,我们来模拟。我们打开开发者工具的console,在里面输入

  var a = [那一大段的列表].map(function(item) {

  return String.fromCharCode(item - 38644)

  }).join('')

  a //输出结果

  结果就可以看到这样的

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  也就是说,解码后,给了这么一段,(事实上这个跟网站底层的js有关联,不然在底层的js里找到 getElevenCode()这个function死活模拟不出来结果)。好的,在站长工具里对解析出来的这段js代码进行格式化,看到的结果呢,只想骂马萌萌!!各个参数都是机器生成的。其中绕来绕去,被绕晕。然后看到一段注释,心想,嘿,后门吧。转码过来看,结果如下

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  好的呀!结果我被嘲讽了!再一次马萌萌!!携程的人太骄傲了。

  从这里我们数数人家的加密就有(1.请求得eleven 2.转码获取新的js 3.再解码)3层加密。转过来一想,都被嘲讽了,说明我离真相就近了。那我们换一个思路,从底层js去找。这时候我们去看人家从哪个js来

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  然后点进去,“ctrl+f”搜 ‘eleven’,结果我们找到这个

  成都爬虫工程师工资实战:分享工作中总结的爬虫经验

  可是我没看明白逻辑!!!!!!

  于是我就卡在这了。

  所以,携程的这个栗子的反爬虫就是通过恶心的js来完成。

  为啥要这样做,因为这类网站的数据不需要通过登陆就能看到

  5. 然后就是验证码

  老大通过机器学习训练出可以识别xx网的验证码,已经上线了,所以验证码形同虚设(暂时的)不过验证码依旧是我认为反爬虫强有力的手段,因为涉及的技术很多,学习成本很高,很容易就放弃了。

  6. 至于像淘宝啊 京东啊微博啊的种种反爬虫,我还没抓过,所以我也不清楚。

  如果你也想入门高薪Python人工智能行业,欢迎你来到达内学习。

(责任编辑:范老师)
最新开班
  • 成都Java培训班
    免费试听名额发放中...
  • 成都C++培训班
    免费试听名额发放中...
  • 成都PHP培训班
    免费试听名额发放中...
  • 成都网络工程培训班
    免费试听名额发放中...
  • 成都Unity3D培训班
    免费试听名额发放中...
  • 成都大数据培训班
    免费试听名额发放中...
  • 成都uid培训班
    免费试听名额发放中...
  • 成都会计培训班
    免费试听名额发放中...
  • 成都Python培训班
    免费试听名额发放中...
  • 成都嵌入式培训班
    免费试听名额发放中...
  • 成都web培训班
    免费试听名额发放中...
  • 成都软件测试培训班
    免费试听名额发放中...
在线留言
提交

校区地址:成都市锦江区东大街紫东楼端35号明宇金融广场19楼1906室

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市高新区奥克斯广场蜀锦路209号一楼商铺

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都锦江区东大街芷泉街229号东方广场C座3楼303

联系电话:15023458194

公交路线:芷泉街(188路;115路;515路;236路;505路;501路;84路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:成都市武侯区佳灵路3号红牌楼广场2号写字楼11楼1115号

联系电话:15023458194

公交路线:红牌楼东(11路;92路;100路;111路;139路;g28路;快速公交K1/K2) 地铁路线:红牌楼站(地铁3号线)

校区地址:成都市锦江区红星路二段70号四川日报大厦502-2

联系电话:15023458194

公交路线:市二医院站(6路;49路;102路;5路;37路;g92路;) 地铁路线:地铁市二医院(地铁3号线)

校区地址:成都市锦江区东大街芷泉段229号东方广场C座16层

联系电话:15023458194

公交路线:芷泉街(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:东门大桥站(地铁2号线)

校区地址:四川省成都市武侯区高新科技孵化园9号园区E座7楼

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

校区地址:成都市高新区奥克斯广场B座1708

联系电话:15023458194

公交路线:益州大道锦城大道口(18路;21路;43路;48路;104路;152路;335路 ) 地铁路线:孵化园(地铁1号线)

了解达内动态
关注成都达内教育公众号

首页 | 关于达内 | 课程中心 | 专家师资 | 视频教程 | 学员空间 | 校企合作 | 新闻资讯 | 就业指导 | 网站地图

2016-2025 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56