游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

数据大作战之网络爬虫

  连续一个星期了,一直是在抓数据。个人水平从小初班到了小中班。好歹是积累了些干货。感觉有必要总结总结了。
  在上干货之前,我先说明下提纲。不感兴趣前部分就可以跳过了。
  第一节,普及下网络数据请求过程
  第二节,几种语言抓取数据的方式
  第三节,Python抓取数据的方法和常见问题,包括中文乱码,post传值,域名登录,接口获取,数据解析处理等
  一,网络数据请求过程
  我可以做一个这样的比喻,浏览网页就像是在跟另一个人用对讲机通话。是的。虽然我们一提到上网冲浪好像是在看电影似的,完全是坐享其成的感受。但是实际上这是一种错误的认识。上网就是在通话,用户在一头说话,服务器在另一头回应。如果用户没有任何操作,你想要的网页是不会跳出来的。而浏览器就相当于对讲机,展示数据的载体。http协议就相当于通话双方的频段。
  再提到域名就不能用对讲机举例了,就要拿电话机来比喻了。我们所有访问的网站,都代表了一个完全独立唯一的个体,就像电话号码。但是电话号码太长了,就需要用另一种容易记忆的方式来标示,这就出现了各种www域名,就像我们手机通讯录存储的姓名。试想一下每次使用百度都输入’61。135。169。121’这样一串数字,谁能吃得消啊。实际上在咱们往浏览器输入简单的www。baidu。com的时候,浏览器仍然在需要在庞大的域名数据库里查询对应的ip地址才能访问到目标网站。比如说你想找北京水利局长,即使你很明确你要找的人是谁也无法和他通话,因为你首先要通过查询找到他的电话号码才能拨通。如果你找不到他的号码,就会得到提示‘查无此人’,这种事情发生在网络上就会出现最经典的404报错。
  假设网站可以正常访问了,相当于电话拨通了。但是并不代表可以正常通话了。因为对方是水利局长每天受到的骚扰多了去了,首先你得表明身份是什么地方的谁谁谁,当电话那头允许了。你这边再说一句‘下面我将表明我的诉求‘,再接下来才是进入网络访问过程。这就是传说中的三次握手。
  既然通话网路已经建立,就进入到了通话过程。一头说,我想让某某给我唱一首伤心太平洋我想让某某某号给我讲一个笑话,然后对讲机那一头就按你的要求进行回复。即使这个时候也是不能保证有求必应的,比如403错误,你想看看对方老婆照片,对方肯定是不允许的;再比如500错误,对方临时上厕所开小差抽风了没法正常通话了;还有一种属于正常300提示,对方转接到其它线路。
  我所认识的网络请求就是这个样子了。希望能满足诸位某些疑惑,也欢迎提出在下认识中的不足之处。
  二,几中编程语言抓取数据的方式
  1)
  本人是搞PHP的,其它领域就业余很多了。所以先拿php说吧,
  最简单的就是fopenfilegetcontents函数了,这就特别像拿来主意了,相当于网页右键查看源代码再复制下来。但是实际上他的简单也说明了它的局限性,只能抓取现成的页面代码,对于post传值和需要登录的就无能为力了,而且它不能keeplive,就像每次通话都要重新拨号,得到需求后再挂断。有些影响效率,比较适用于文本内容比较简单而且不作处理的页面。
  另一种就是curl模拟提交了,属于伪造浏览器访问。可以设置post参数,甚至可以传输文件,应该范围很广,尤其是公众号开发,第三方接口获取数据。缺点就是配置特别多,所以我猜大部分跟我一样使用复制大法进行套用。另外,curl对于登录验证码这种高难度的操作就不太灵了。
  2)
  再接下来说一说js,jquery,vue。js,jsonp,ajax,这几种不同的名字在获取数据方法其实都是一种方式,就是ajax异步获取。当然其中肯定是有差别的,后面再细说。
  它的优点是不必整个页面重新获取,而是只获取某一个数字或图片或单独一页内容再进行填充,用户体验效果好,并且节省网络资源。缺点是它并非真正意义上的抓取数据,而是类似于接收数据。因为ajax获取的数据及数据格式都是预先定义好的,只需要按照预定参数去获取就好了。
  其中jsonp是较特殊的一种了,优点是可以跨域,就是可以获取不同域名站点的内容。缺点是只能使用get提交。至于使用非jsonp跨域获取数据的ajax类似的在网上还有大把方法可寻。世上无难事,只怕有心人。
  3)
  Node。js,据说这是近两年特别火爆的语言。我就感觉做程序员就是个无底洞,三天两头出来个新语言,新升级,新类库。不学不行,学了也感觉就那样。所以我就看了两个小时的教程,get了点皮毛,貌似是功能挺强大,操作也挺简单。可以完成各种高难度的数据抓取。下面是一段简单的抓取数据的源码,包含抓取到解析的过程,自行体会吧。
  varhttprequire(http)
  varcheeriorequire(。cheerio)
  varurlhttp:www。imooc。comlearn348
  functionfilterChapter(html)
  {
  varcheerio。load(html)
  chapters(。chapter)
  varcourseData〔〕
  chapters。each(function(item){
  varchapter(this)
  varchapterTitlechapter。find(strong)。text()
  varvideoschapter。find(。video)。children(li)
  varchapterData{
  chapterTitle:chapterTitle,
  videos:〔〕
  }
  videos。each(function(item){
  varvideo(this)。find(。Jmediaitem)
  varvideoTitlevideo。text()
  varidvideo。attr(href)。split(video)〔1〕
  chapterData。videos。push({
  title:videoTitle,
  id:id
  })
  })
  courseData。push(chapterData)
  })
  returncourseData
  }
  functionprintCourseInfo(courseData){
  courseData。forEach(function(item){
  varchapterTitleitem。chapterTitle
  varchapterVideositem。videos
  console。log(chapterTitle)
  chapterVideos。forEach(function(video){
  varvideoTitlevideo。title
  varvideoIdvideo。id
  console。log(〔videoId〕videoTitle)
  })
  })
  }
  http。get(url,function(res){
  varhtml
  res。on(data,function(data){
  htmldata
  })
  res。on(end,function(){
  courseDatafilterChapter(html)
  console。log(courseData)
  printCourseInfo(courseData)
  })
  })。on(error,function(){
  console。log(获取数据出错)
  })
  4)
  最后再说一说python了,这门语言算是抓取数据的老牌专业户了,一提到它的名字就会联想到’爬虫’二字。我对它接触了有一个来月吧,就感觉python是个啥也不是,但是啥也能干的玩意。如果不加载模块好像啥也干不了了,但是所有想到的需求只要配合相关模块全都能做。比如能做网站,能做桌面应用程序,也能写用来执行爬虫的页面。
  useragentMozilla4。0(compatible;MSIE5。5;WindowsNT)
  headers{UserAgent:useragent}
  responseurllib2。urlopen(request)
  ifresponse。getcode()!200:
  returnNone
  returnresponse。read()
  这一段是基本的抓网页内容的代码,是不是比较牛逼,它的优点是完全伪装成浏览器的样子,连什么样的浏览器,什么样的系统,用什么方式去访问,需不需要ip代理,完全照办。所以我还是推荐使用python来抓取数据,代码简单,模块丰富,功能强悍,linux还自带python,只要花两三个小时就能get到一套受用的抓取方法。每次写好程序看着终端窗口不断跳动抓取过程,爽得不要不要的。
  以上是我所知领域的抓取方式,毕竟也是小白一枚,未见过大世面。大牛大咖们莫要耻笑。
  三,python爬虫的常见方法和问题总结
  总算是进入干货阶段了,方法一说出来就很简单了。但是这些方法和问题却是实例开发中遇到且花长时间才找到解决方法的,比如说中文乱码的问题,我在网上查询解决方案,五花八门感觉都说得有理,折腾了三个多小时就是不成功。最终是自己尝试才找到方法,后面会详细说明。这里就不多说了。
  首先说说爬取数据的方法,前面已经贴了一部分。在这里咱们再系统的罗列一遍。基本上用得都是urllib2和urllib模块。
  a)最简单的不带参数的爬取。
  furllib2。urlopen(url,timeout5)。read()
  b)带header参数的
  useragentMozilla4。0(compatible;MSIE5。5;WindowsNT)
  headers{UserAgent:useragent}
  requesturllib2。Request(url,headersheaders)
  responseurllib2。urlopen(request)
  ifresponse。getcode()!200:
  returnNone
  returnresponse。read()
  c)带post参数的
  useragentMozilla4。0(compatible;MSIE5。5;WindowsNT)
  headers{UserAgent:useragent}
  value{
  name:BUPT,
  age:60,
  location:Beijing字典中的内容随意,不影响
  }
  postdataurllib。urlencode(value)对value进行编码,转换为标准编码
  requesturllib2。Request(url,datapostdata,headersheaders)
  responseurllib2。urlopen(request)
  ifresponse。getcode()!200:
  returnNone
  returnresponse。read()
  d)需要登录和验证码的页面,利用本地cookie文件爬取,需要使用cookielib模块
  cookiecookielib。MozillaCookieJar()
  cookie。load(cookies。txt,ignoreexpiresTrue,ignorediscardTrue)
  requrllib2。Request(http:bbs。fobshanghai。comqun。php?subcatid576)
  openerurllib2。buildopener(urllib2。HTTPCookieProcessor(cookie))
  urllib2。installopener(opener)
  responseurllib2。urlopen(req)
  printresponse。read()
  PS:cookie文件可以利用firebug工具导出,要特别注意两点,1是在文本第一行加上‘NetscapeHTTPCookieFile’,这样一句话声明这是一个cookie文件,不然会报错,http。cookiejar。LoadError:cookies。txtdoesnotlooklikeaNetscapeformatcookiesfile2。检查一下每行的项目是不是齐全,里面包含了每条cookie的域名,布尔值,适用途径,是否使用安全协议,过期时间,名称,值共7个属性,缺一个就会报错。如果少的话,随便从其它行复制过来就可以。如果再报错,就用一个笨方法。复制一行正确的cookie,然后每个属性值一一复制粘贴过来。关键时刻还就得这样整。
  e)获取json数据
  按说获取接口的jsono数据是最简单的了,但是习惯使用beautiful模块去解析页面的DOM元素,遇到json数据反而傻眼了。所以在这里特别说明下json数据解析使用到的模块和方法。
  解析json数据,我使用的是demjson模块,操作也是很简单的。使用datasdemjson。decode(soup),就可以像使用字典那样去取值了。
  f)涉及用户登录及验证码的网页
  针对验证码的爬取方法,网上同样有很多教程。但是本人没有成功完成的经验所以就不敢妄言了,目前来看掌握这几种方法就已经够用了。
  说完了获取接下来就谈一谈解析了,毕竟拿到手的不是json数据而是一堆零乱的html文件,怎么取自己想的数据还要有很多路要走。我经常使用的beautiful模块,下面也是就这个模块来进行讲解。
  a),获取id,class,以及标签的DOM元素
  contsoup。find(p,iddlist)获取id名称为‘dlist’的p元素
  link。find(span,classctit)获取class名称为’ctit’的span元素,注意class不同于’class’
  b)获取元素的文本内容和属性值
  soup。find(a)。gettext()获取a标签的文本内容
  soup。find(a)〔href〕获取a标签的链接地址
  soup。find(img)〔src〕获取图片地址
  c)去除DOM元素中的部分元素
  contsoup。find(p,iddlist)
  cont。find(p,classppp)。extract()去除id为’dlist’元素中的class为‘ppp’的p元素
  d)去除a标签的href属性
  dellink。find(a)〔‘href’〕实际开发中需要遍历操作
  e)去除某DOM元素中的第N个某标签元素,或倒数第N个某标签元素
  看似伤脑筋的题目,其实只要循环遍历其中所有元素,然后按照下标做选择判断就可以了。如果是去除倒数第N个元素,可以循环两次,第一次取到元素总数,第二次再相应操作就可以了。对于这种问题关键是思路。
  f)图片地址问题
  因为爬取数据的同时,也需要把图片抓取到本地,这就面临一个图片地址的问题。页面内容的图片地址和获取到自己服务器上的图片地址必须相对应。我在这里提供两个思路,一是如果抓取的网站里面的图片都是放在一个服务器上,那么就远程获取图片下载到自己服务器的相同目录下。这样图片抓到了,内容也抓到了,还不影响页面展示。所以把页面里的所有图片地址传到一个列表里,再一一远程下载到本地服务器。二是面对要抓取的网站里的图片来自不同服务器,这就有些棘手。即使是抓取到自己服务器相同的目录,也要使用正则表达把页面里图片的地址替换掉。我估计大部门程序员对正则还是有些怵的。所以我就采用了迂回战术,遍历出页面里所有的图片地址,分别下载到本地服务器后分别替换新地址。代码比较长就不在这里展示了,放个github库地址给大家观摩吧,https:github。comzuoshoupaicodetreemasterwxfunyparse。
  常见的招数也就这些了,最后再说一说令人头疼的中文乱码问题。
  网上对于乱码的说法有很多,大概也是由于造成乱码的原因有很多吧。不能全部适用。我就先把一般出现的原因罗列一下,a)页面本身是非utf8编码;b)程序开发环境也就是编辑器非utf8编码c)服务响应的AcceptEncoding采用了gzip压缩d)其它原因,比如cmd不支持显示中文或者设置不正确
  因为造成乱码的原因有很多,所以我们首先要排查是哪种问题造成的。我的建议是在获取到页面的内容后马上输出,并导出到本地文件,也就是response。read()后马上打印。如果输出显示或是本地文件显示正常,就表示页面编码是没有问题的,问题出在解析上。所以使用response。read()。encode(utf8)解决问题。我上次遇到的问题很是奇葩,页面获取内容后打印输入正常,然后解析处理后就乱码了,我就使用各种decode,encode咋都不好使。最终没辙了,使用chardet模块把每一步的编码格式都打印出来,发现在传输过程中,gbk变成了utf8,也就是说明明是gbk的文本当成是utf8展示,而且还转不过来。最后我把最开始获取数据的地方转换成utf8就OK了。
  希望这个小例子能给你带来一些启发,遇到bug千万不能乱,必须一步一步整理思路,确定问题所在,才能一击而中,成功解决。
  好了,关于爬数据的知识总结就到这了。现在突然有种顿悟,所谓编程就是数据的交互,正确的传给别人和正确的拿到别人的。说来简单,中间的过程就是千辛万苦了。

用安卓手机丢人吗?网友在微博上吵起来了用安卓手机丢人吗?最近有很多让人无语的问题,这个问题绝对是第一位,甚至超越了《你微笑时很美》好看吗?(图源:微博《你微笑是很美》电视剧)小魔王前几天在浏览网页……哪些牌子的蓝牙耳机口碑好,这几个牌子的蓝牙耳机口碑好且实用蓝牙耳机嘛,讲究的就是方便携带小巧轻盈嘛。今天呢,我主要给大家分享几款我觉得很好且很实用的蓝牙耳机。对于爱听歌追剧的小伙伴是可以完全驾驭的了的神仙蓝牙耳机。音质上真的也是秒杀同……华为再声明不造车也不投资任何车企中国网汽车5月24日讯日前,华为官方再次声明称华为不造车,同时华为表示至今为止并未投资任何车企,未来也不会投资任何车企,更不会控股、参股。以后凡是称华为造车,或者参股汽车制造行……热播剧扫黑风暴全集泄露,盗版问题为何总是屡禁不止?在近期热播的电视剧中,《扫黑风暴》算得上是最受观众欢迎的作品之一,这部根据真实案例改编,由孙红雷、张艺兴、刘奕君等演员联袂主演的电视剧,一经播出就收获到大量观众的好评,随着剧情……商标无效!阿里巴巴申请双11被驳回近日,阿里巴巴于2019年1月申请注册的双11商标(以下简称诉争商标)申请被驳回。消息一经传出,就有网友表示震惊:双11不是阿里巴巴首先提出的吗?为什么会被驳回呢?我们先……超级融合素材慈爱的勇者高斯奥特曼高斯奥特曼(其名Cosmos的英文意思为宇宙,尤指被视为有序体系时的宇宙),是来自宇宙的奇迹光之巨人,期盼和平,不喜欢相互争斗,主张不伤害对方并且建立友好关系,但是面对邪恶的敌……长安CS55PLUS新款8月5号预售月底上市,尺寸动力双升级对于长安来说,家族CS系列的SUV车型一直当作宝贝对待。根据最新消息显示8月5号长安新款CS55PLUS将开启预售,现款车型很多人依旧印象深刻,在价格定位上很亲民,起售价在9。……势不可挡,GL8家族10月再创单月销量记录在国内MPV领域,别克GL8一直有着江湖霸主的地位,其屡创新高的销量就是最好的证明。近日,上汽通用汽车公布了10月销量数据,别克品牌销量再次飘红,其中,别克GL8以17716辆……李亚鹏折戟丽江,雪山小镇成剩女李亚鹏折戟丽江,雪山小镇像极了当今剩女,高不成低不就,富人看不上,穷人别做梦。验证一网络名言:运气得来的钱,最后往往靠实力亏掉。这是天道轮回。明星的钱来得轻松,轻松得的财富最容……老年人也能看懂的电脑知识第六篇什么是电源?大家好,我是兰州老张,从事电脑行业20余年,写此系列文章的初心在于让广大老年人也能搞明白各类复杂的电脑知识,文章里不会出现生涩的专业名词和硬核知识,希望大家喜欢关注支持收藏点赞……10亿原色臻彩护眼幕屏还原真实美景,华为nova9Pro手机在华为nova9系列手机的发布会上,它强大的实力,吸引了众多消费者的目光与期待;终于,在首销日当天,我很荣幸地抢到了一台华为nova9Pro,又正好赶上十一小长假,我的国庆旅途……王晶新版倚天屠龙记即将开拍,这演员阵容真是强大1993年,王晶拍了一部武侠电影《倚天屠龙记》,这部电影由李连杰、张敏、邱淑贞、黎姿、洪金宝、吴镇宇等人主演,这一部港片是无数影迷心中的经典之作。看过《倚天屠龙记之魔教教……
电视剧拜托了班长开机谢林彤演绎反差萌教师引期待星关系6月11日讯由企鹅影视、霍尔果斯哇唧唧哇娱乐文化有限公司出品,腾讯视频独播,焉栩嘉、夏之光、代露娃、谢林彤等主演的青春校园电视剧《拜托了班长》正式开机。该剧以森永高中被迫……对标华为!小米第一款竖向折叠屏手机已在路上今天,博主数码闲聊站爆料,小米研发的竖向折叠屏手机已在路上,有望在今年跟消费者见面。在去年上半年,小米推出了旗下第一款量产折叠屏旗舰MIXFOLD,它采用了类似三星Gal……江山如此多娇二轮开播硬核青春再掀热潮电视剧《江山如此多娇》于1月27日晚在湖南卫视完美收官。碗米溪,很高兴认识你,当首播大结局时罗晋饰演的濮泉生即将离开承载了自己青春和理想的碗米溪时,他的一句温暖治愈的台词,再次……于思楚出演十二谭盛产表情包戏精本精笑翻观众近日,由优酷、唐人影视联合出品,古力娜扎、刘以豪、谷嘉诚、安琥、于思楚等主演的民国传奇爱情剧《十二谭》正在热播,剧中于思楚一改御姐A飒风范,饰演段司令(安琥饰)的大太太如梅,与……陈星旭号手就位上星首播演绎火箭军飒爽英姿由陈星旭搭档李易峰、张馨予等主演的电视剧《号手就位》官宣正式定档。4月13日起在浙江卫视、江苏卫视、优酷平台同步播出。《号手就位》作为国内首部火箭军题材电视剧,讲述了一群火箭军……东方卫视我们在行动公益大使陈蓉携手童瑶李宗翰策划最美时装秀彝星关系3月14日讯昨晚(3月13日)东方卫视《我们在行动》第三季第一站圆满收官,本站公益大使陈蓉、童瑶、李宗翰、汪文平走进云南楚雄州武定县半山村,这里因为先天条件的限制,交通闭……东方卫视我们在行动第三季首播陈蓉童瑶李宗翰探寻彝绣商机神奇工星关系3月7日讯昨晚(3月6日)21:30东方卫视《我们在行动》第三季暖心出发,新一季模式再升级,明星化身为心愿委托人,邀请节目组走进家乡,体验家乡的生活,倾听家乡的故事,首站……京东物流正式上市!刘强东留下的王牌,终于证明了自身的价值在我国电商行业的快速发展之下,也是产生了多家国产电商巨头,比如大家熟知的阿里巴巴、京东等等。作为我国电商行业的主导者之一,京东虽然起步时间比阿里巴巴略晚,但得益于其自身独有的竞……万绮雯欧阳震华经典CP再联手伙计办大事今晚开播由TVB金牌班底打造,欧阳震华、马德钟、万绮雯领衔主演的《伙计办大事》终于在众多港剧爱好者的翘首期盼下,于4月12日登陆优酷港剧场,让众多的港剧粉在这个四月可以一尝所愿。……女生为什么害怕生孩子?她们创业的那些事儿道出女性心声由恩乔依影视独家发行,许肇任、冯家瑞执导、林心如担纲制作,金钟编剧吕莳媛亲自操刀,陈意涵、林心如、邱泽、简嫚书、宥胜、林哲熹领衔主演,李立群、蓝心湄实力助阵的都市情感创业剧《她……6G立体泛在智联天下来源:人民日报海外版黄维肖像画。本栏目画家张武昌绘廖建新肖像画。本栏目画家张武昌绘中国科学院院士黄维(中)受聘为科技部6G研发国家重点专项咨询专家……韩丹彤如懿传遇喜又遇蛇揣摩角色称位份差最难演星关系8月28日讯由韩丹彤搭档周迅、霍建华、张钧甯、董洁、童瑶、胡可等人主演的清宫传奇巨制《如懿传》,目前正在腾讯视频热播之中。该剧上线一周,网播量破十亿,成绩不俗热议不断。昨……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网