简述:
爬虫是一种代码,这个技术诞生的背景是通过计算机技术来批量处理,采集互联网诞生的海量数据,今年社交网络的发展使得预测群体情绪技术成为可能,这和大数据的应用密切相关。爬虫目前主流是基于python的第三方库进行的,主要有beautifulsoup 俗称bp4和scarpy库,其中scrapy是框架,基于黑箱操作,可以实现多线性采集,这在实际中是比较有效率的。在匹配筛选时有xpath和正则表达式两种匹配方式,其中xpath是一个python的第三方模块,正则是一种类似sql查询的格式化查询规则,xpath是针对html文本的定向第三方包,它可以根据网页源码的标签属性进行定位,个人实际使用中感觉还是比较方便;正则表达式则是针对全部文本操作,也就是它把html源码全部识别为字符,按照字符或数字的排列规律进行筛选,,自由度更大,但是需要准确构造匹配格式,在网页中使用起来不如xpath有效率。
- 程序框架/思路
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规律,比如去哪网的网页中,归纳下来就是几个固定步骤:
- 使用bs4获得目标网页的html代码,形成一个对象
- 使用xpath获得相应特定属性的标签内容,拆解html代码
- 保存收集回来的信息
主要是要分析清楚网页的设计,这个部分是能否爬取正确信息的关键,因为具体的爬取部分只是循环的筛选目标url。当然在爬取的时候要遵守robot协议(使用scrapy框架千万不要屏蔽robot协议,就是在环境设置默认为ture的那项,千万不要改成false,不要强行翻人家的衣柜,虽然不改的话是不能用的哦)
'http://piao.qunar.com/ticket/list.htm?keyword='+ str(place) +'®ion=&from=mpl_search_suggest&page={}'
'https://piao.qunar.com/ticket/list.htmkeyword=北京®ion=&from=mps_search_suggest'
中间的str部分就是总的入口网址,这个网址可以添加全国各地的地名进行检索,在最后page页面是用来顺序爬取的内容
其中页面包含了当前页面的前几个景点,从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月国庆期间的对比发现确实是冷清了不少,不过上海一直是热点旅游区域,珠三角的热度明显下滑,可以看出长三角地区的第三产业还是比较出色的。
重点分析思路:
数据可视化只是载体,从数据的潜在价值可以发现存在以下思维路线
- 数据为什么服务?
- 数据为企业带来什么?
- 数据对于能对未来产生什么样的参考价值?
以上是围绕数据进行的初步疑问,解决这些问题就可以明白数据能怎样的指导企业,以及对企业的指示。
从携程经营者的角度观察,可以从几个方面进一步挖掘,以用户维度对数据进行分类,可以看到用户的倾向,用户的分类,用户的消费热情周期,用户对于不同价格的喜好,由此得到的数据可以进一步贴合用户,使产品对客户的吸引力更大,粘性更足。
在经营能力有限的情况下,如何有效的倾斜资源更是可以从数据中获取结论支撑,通过对热点的把握,可以集中有限资源,深入挖掘热点地区的潜力,避免力量分散,无法突破关键点。
在时间序列上进行连续分析可以得到不同季节,不同时期,不同假期的热点变化,可以有效的提供一定预测周期的结果,作为具体业务部门的参考。
我爬取的数据集已经上传到github了,为各位大佬免去爬虫学习的痛苦 = ^ =.