互联网旅游数据爬虫代码讲解和数据分析

简述:
爬虫是一种代码,这个技术诞生的背景是通过计算机技术来批量处理,采集互联网诞生的海量数据,今年社交网络的发展使得预测群体情绪技术成为可能,这和大数据的应用密切相关。爬虫目前主流是基于python的第三方库进行的,主要有beautifulsoup 俗称bp4和scarpy库,其中scrapy是框架,基于黑箱操作,可以实现多线性采集,这在实际中是比较有效率的。在匹配筛选时有xpath和正则表达式两种匹配方式,其中xpath是一个python的第三方模块,正则是一种类似sql查询的格式化查询规则,xpath是针对html文本的定向第三方包,它可以根据网页源码的标签属性进行定位,个人实际使用中感觉还是比较方便;正则表达式则是针对全部文本操作,也就是它把html源码全部识别为字符,按照字符或数字的排列规律进行筛选,,自由度更大,但是需要准确构造匹配格式,在网页中使用起来不如xpath有效率。


  1. 程序框架/思路
import requests
from lxml import etree
import time
import pandas as pd
import json
import re 

第三方库导入

r = requests.get(url,timeout=30)
        #如果状态码不是200,引发HTTPError异常
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

这里我采用了except抛出异常,代码主要实现对网络包的header头中状态报文信息进行判断,报文信息由服务器端返回,正常情况下服务器的代码编写者需要按照标准对各种互联网中的错误写出返回错误类型,比如常见的网页路径不存在404错误,以及500等。

这里引入解释

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
所有状态码的第一个数字代表了响应的五种状态之一。
100系列码
从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们 是很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另 外,这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。
200系列码
200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。
300系列码
300到399范围的状态码是重定向代码。本质上,它们告诉Web浏览器必须执行其它一些操作以完成请求。基于这个命令的特点,它可以自动地执行,或者要求额外的用户输入。比如,状态码301表示一个特定资源已经被永久地先移除,因此将来所有访问该资源请求都应该定向到一个特定的URL上。
400系列码
在400范围的状态码是客户端错误码。这种类型的错误码往往跟安全相关。比如,如果一个客户端尝试访问一个未授权访问的资源,服务器就会返回一个状态码401。类似地,如果客户端尝试访问一个禁止的资源,在这种情况下客户端的认证状态是一样的,那么服务器可能会返回一个状态码403,表示禁止对该资源进行访问。
如果请求不正确或客户端超时,400级错误码也可能被返回。然而,有一个400级的代码总是具有误导性:404。虽然这个代码在技术上被归类为客户端错误,但是事实上它可以同时表示客户端或服务器上的错误。但这个错误码只是简单地显示为没有找到请求的资源。当这个错误发生在客户端时,它往往表示的是网络连接问题。在其他时候,这个错误的发生还可能是由于资源已从服务器上转移或重命名而造成的。
500系列码
500级状态码表示的是服务器错误。比如,如果Web服务器超时,它就会产生一个504错误。虽然,一个500级的错误往往表示的不是服务器的问题,而是在服务器上运行的Web应用的问题。比如,我自己的个人网站是用ASP编写的,它负责动态生成HTML网页。在调试的过程中,有Bug的代码总会导致我的Web服务器返回HTTP状态码500,该代码是一般表示内部服务器错误。这个代码只是出 现问题了,并且HTTP无法解决该问题。

主要爬取逻辑是获得网页的url规律,比如去哪网的网页中,归纳下来就是几个固定步骤:

  1. 使用bs4获得目标网页的html代码,形成一个对象
  2. 使用xpath获得相应特定属性的标签内容,拆解html代码
  3. 保存收集回来的信息

主要是要分析清楚网页的设计,这个部分是能否爬取正确信息的关键,因为具体的爬取部分只是循环的筛选目标url。当然在爬取的时候要遵守robot协议(使用scrapy框架千万不要屏蔽robot协议,就是在环境设置默认为ture的那项,千万不要改成false,不要强行翻人家的衣柜,虽然不改的话是不能用的哦)

'http://piao.qunar.com/ticket/list.htm?keyword='+ str(place) +'&region=&from=mpl_search_suggest&page={}'

'https://piao.qunar.com/ticket/list.htmkeyword=北京&region=&from=mps_search_suggest'

中间的str部分就是总的入口网址,这个网址可以添加全国各地的地名进行检索,在最后page页面是用来顺序爬取的内容

QQ浏览器截图20191202004300.png

其中页面包含了当前页面的前几个景点,从html中读取每一个子页面的具体url,然后筛选出
网页内包含的信息就可以了,构思好你所想要的信息就可以给采集到的数据进行排版并保存了,可以直接使用excel的库也可以使用pands进行保存。

def listToExcel(list,name):
    df = pd.DataFrame(list,columns=['景点名称','级别','所在区域','起步价','销售量','热度','地址','标语','详情网址'])
    df.to_excel(name + '景点信息.csv')

这里是简单的例子,简单介绍一下pandas的数据类型dataframe,这是一个二元表类型,他是一个多维列表,这个数据格式存在列的属性,可以按照列进行操作,也可以按照行操作,不过我只有在合并的时候才会对行数据进行操作,简单的调用to_excel函数就可以把文件保存为各种格式,我这里保存为csv文件是为了方便处理,也可以不用保存直接进行数据分析。

使用echarts,结合爬取回来的经纬度就可以对数据可视化处理了,可以看到主要的景点还是集中在北上广,成都也是一个热点不过绝大多数都处于东部,西部有海拔了之后就很少有热门景点了,开篇的图片是在12月份爬取的数据,与这份10月国庆期间的对比发现确实是冷清了不少,不过上海一直是热点旅游区域,珠三角的热度明显下滑,可以看出长三角地区的第三产业还是比较出色的。

重点分析思路:
数据可视化只是载体,从数据的潜在价值可以发现存在以下思维路线

  1. 数据为什么服务?
  2. 数据为企业带来什么?
  3. 数据对于能对未来产生什么样的参考价值?

以上是围绕数据进行的初步疑问,解决这些问题就可以明白数据能怎样的指导企业,以及对企业的指示。
从携程经营者的角度观察,可以从几个方面进一步挖掘,以用户维度对数据进行分类,可以看到用户的倾向,用户的分类,用户的消费热情周期,用户对于不同价格的喜好,由此得到的数据可以进一步贴合用户,使产品对客户的吸引力更大,粘性更足。
在经营能力有限的情况下,如何有效的倾斜资源更是可以从数据中获取结论支撑,通过对热点的把握,可以集中有限资源,深入挖掘热点地区的潜力,避免力量分散,无法突破关键点。

在时间序列上进行连续分析可以得到不同季节,不同时期,不同假期的热点变化,可以有效的提供一定预测周期的结果,作为具体业务部门的参考。

我爬取的数据集已经上传到github了,为各位大佬免去爬虫学习的痛苦 = ^ =.

https://github.com/wenpuhua1/datalist

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 2系列200 OK请求已成功,请求所希望的响应头或数据体将随此响应返回。201 Created请求已经被实现,而且...
    Y像梦一样自由阅读 3,559评论 1 5
  • 爬虫概述 1. 目录清单 爬虫简介 通用爬虫和聚焦爬虫 网络请求那些事儿 网络数据抓包分析 2. 章节内容 2.1...
    小皇帝s阅读 682评论 0 1
  • HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。有些 App...
    咖啡绿茶1991阅读 2,210评论 0 7
  • 匆匆忙忙,一周又过去了。现在是真的觉得光阴似箭,岁月如梭。 早起:本周基本保持在六点半左右,每天都觉得很累,早上起...
    一一0327阅读 112评论 0 0
  • 假如有一天我突然死去,我什么也不会感受到,但我知道我的亲人,我的爱人会很伤心。 假如有一天我突然死去,我的...
    帝古牛阅读 1,071评论 0 1