APP下载

基于网络爬虫技术的时令旅游信息获取

2018-05-30郑鑫臻吴韶波

物联网技术 2018年5期
关键词:时令爬虫队列

郑鑫臻,吴韶波

(北京信息科技大学,北京 100101)

0 引 言

时令旅游以随气候的季节变化而呈现明显季相性特征的旅游资源为观赏、娱乐对象,如春季赏花、秋季观红叶等[1]。常规时令旅游信息获取主要基于历史物候观测数据,首先根据空间位置、气温、降水等数据,预测新一年观赏花花期,然后通过物候观测站点验证调整。物候数据一般从纸质版《中国自然历选编》《中国自然历续编》《自然物候观测年报》中选取,经过人工录入、校对,转化为电子表格资料,再进行相关分析研究,不仅耗费巨大的人力、物力和时间,而且难以满足时令旅游活动开展的需求[2,3]。此外,植物生长时令对气候变化敏感,准确预测花期成为了时令旅游首要解决的难题[4]。

随着互联网的普及,海量的互联网数据蕴含了大量的时令旅游信息。网络爬虫(Web Crawler)技术是快速获取时令旅游相关信息的全新手段[5]。本文在概述网络爬虫关键技术的基础上,以四川省桃花花期为研究对象,进行了基于网络爬虫技术的时令旅游信息获取案例实现。

1 关键技术

1.1 Python

Python语言是一种功能强大、语法简洁清晰的开源编程语言,几乎能在目前所有的操作系统上运行。Python具有的丰富的标准库和强大的第三方库使其在爬虫开发中具有非常明显的优势:当模拟浏览器行为访问网站时,Python的抓取接口比其他语言(如Java,C,C++等)更简洁;Python的requests库能简洁高效地提取出网页的HTML信息,Requests提供了HTTP所有的基本请求方式,如Post,Put,Delete,Head和Options等,在网络爬虫中用于获取网页的HTML信息;Python提供的lxml库能用简洁的代码解析HTML标签,用于将可能不合法的HTML解析为统一格式,查找、定位标签,访问标签属性、文本内容等,完成文本提取工作[6]。

1.2 网络爬虫通用框架结构

通用的网络爬虫框架结构如图1所示。

图1 通用的网络爬虫框架结构

网络爬虫的基本工作流程如下[7]:

(1)选取合适的起始URL,放入待爬取URL队列;

(2)从待爬取URL队列中取出URL,由网页下载模块下载URL对应的网页HTML,传递给数据解析模块,再将下载过的URL放进已爬取URL队列;

(3)数据解析模块解析收到的HTML,查找标签,提取出标签内所需数据,传递至数据清洗模块,再将提取出的下一层URL传递至URL调度模块;

(4)URL调度模块收到数据解析模块传递过来的URL后,将其和已抓取的URL队列比较,进行去重处理,舍弃已爬取过的URL,将未爬取过的URL放入待爬取URL队列;

(5)网络爬虫系统在(2)~(4)步循环,直到待爬取队列中的URL全部爬取完毕,或者用户终止爬虫系统;

(6)数据清洗模块发现并纠正数据文件中可识别的错误,最终将数据存入数据库。

2 研究对象与数据来源

2.1 研究对象

四川省时令旅游开展历史悠久,其中桃花赏花旅游具有广泛的群众基础[8]。媒体报道中对其有着丰富的历史信息,从而降低了时令旅游信息获取的难度,同时可将其与往年物候观测记录进行比较,即可验证所获取信息的准确性。因此,本文以四川省桃花赏花旅游为研究对象,通过网络爬虫技术获取时令旅游信息。

2.2 数据来源

因为时令旅游对数据敏感,所以准确性是时令旅游信息获取首要考虑的问题。因此,本文选取的时令旅游数据源为四川省当地知名纸质媒体,如《成都商报》《华西都市报》《四川日报》和《天府早报》等;知名门户网站,如四川新闻、新浪和搜狐等;知名旅游网站,如携程、去哪儿、蚂蜂窝和驴妈妈等。

3 案例实现

本文以爬取《天府早报》正文为案例,详述通过网络爬虫技术获取时令旅游信息的过程与方法。

3.1 起始URL

《天府早报》的首页网址为https://e.thecover.cn/shtml/index_tfzb.shtml,该网站不具有特殊性,如果以此为起始URL,需要通过爬虫确定待爬取URL队列,增加了爬虫下载、解析网页的操作,既影响效率,又增加了被网站反爬虫机制检测发现的风险。通过分析发现,https://e.thecover.cn/shtml/tfzb/yyyymmdd/vB1.shtml为yyyy年mm月dd日《天府早报》的首页,修改该网址对应日期,即可直接访问该日《天府早报》首页,通过以下代码,输入起始日期start_date与结束日期end_date,即可生成待爬取URL队列。

3.2 获取网页HTML

通过Requests库的r = requests.get(url)方法,可以获取名为r的Response对象,Response对象中包含了该URL的HTML信息。部分网站服务器对非浏览器的请求不予响应,因此,爬虫需要在请求头中加入浏览器信息,伪装成浏览器对网站进行访问请求。在浏览器地址栏中输入about:version,可以查询到浏览器的User-Agent,将其加入requests.get方法中,即可将爬虫程序伪装成浏览器,向目标网站服务器发起get请求。返回的Response对象的content属性即为该URL的二进制编码HTML。

import requests

def get_response(url):

headers = {'

User-Agent': ‘Mozilla/5.0 (Windows NT 10.0 ; WOW64)

AppleWebKit/537.36(KHTML, like Gecko)'

'Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2141.400

QQBrowser/9.5.10219.400'}

r = requests.get(url, headers=headers)

return r

3.3 解析HTML

通过解析报纸首页的HTML,获取该期报纸所有新闻的URL,再分别解析新闻网页的HTML,即可获得所需信息。lxml库能高效解析HTML,通过lxml的etree.HTML解析完二进制HTML后,选用Xpath选择器,在XML文档中对元素和属性进行遍历。

from lxml import etree

def get_etree_items(content, xpath):

html = etree.HTML(content)

items = html.xpath(xpath)

return items

打开浏览器的开发者工具,可以发现如图2所示的HTML结构,新闻后半段URL存于class属性为title-list的标签u1下,通过XPath选择语句//*[@class="title-list"]/li/a/@href,即可筛选出该期报纸所有新闻的后半段URL,再与https://e.thecover.cn/拼接即可得到完整的新闻URL。

图2 《天府早报》HTML结构

同样地,分析新闻URL,新闻正文存于HTML的h3标签正文中,通过XPath选择语句//h3/text(),即可获取新闻正文。代码如下:

news_response = get_response(index_url)

for detail in get_etree_items(news_response.content, '//*[@

class="title-list"]/li/a/@href'):

detail_url = index_url[0:20] + detail

detail_response = get_response(detail_url)

get_etree_items(detail_response.content, '//h3/text()')

3.4 数据清洗

判断爬虫获得的信息是否完整,包括HTML、时间、URL地址、正文。

def __validate_crawler_data(data):

if not data.get("content"):

raise StorageException

if not data.get("update_datetime"):

raise StorageException

if not data.get("url"):

raise StorageException

if not data.get("text"):

raise StorageException

最后,将获取的爬虫数据存储于基于分布式存储的MongDB数据库中。

4 结 语

本文构建了以新闻媒体、门户网站和知名旅游网站为数据源,以网络爬虫技术为工具的时令旅游信息获取方法,以《天府早报》新闻正文爬取为例,进行了实例研究,最终爬取2013年6月1日至2017年12月31日之间《成都商报》《华西都市报》《四川日报》和《天府早报》新闻300万条,四川新闻、新浪、搜狐、携程、去哪儿、蚂蜂窝和驴妈妈等旅游新闻20万条,所用时间累积不超过24小时,表明通过网络爬虫技术能高效获取互联网中大量的时令旅游信息,能有效支撑后续研究。

[1] 刘俊,李云云,刘浩龙,等.气候变化对成都桃花观赏旅游的影响与人类适应行[J].地理研究,2016,35(3):504-512.

[2] 韩超.中国近40年物候季节对气候增暖的响应研究[D].北京:中国科学院地理科学与资源研究所,2006.

[3] 毕伯钧.自然物候历应用的研究[J].中国农业气象,1999,20(3):9-14.

[4] 马丽,方修琦.近20年气候变暖对北京时令旅游的影响——以北京市植物园桃花节为例[J].地球科学进展,2006,21(3):313-319.

[5] 于娟,刘强.主题网络爬虫研究综述[J].计算机工程与科学,2015,37(2):231-237.

[6] 陈政伊,袁云静,贺月锦,等.基于Python 的微博爬虫系统研究[J].大众科技,2017,19(8):8-11.

[7] RICHARD L.用Python写网络爬虫[M].李斌,译.北京:人民邮电出版社,2016.

[8] 董瑾.成都地区花卉旅游发展研究——以成都市各类花节为例[D].成都:四川师范大学,2012.

猜你喜欢

时令爬虫队列
利用网络爬虫技术验证房地产灰犀牛之说
春季时令尝鲜
时令湖——艾尔湖
基于Python的网络爬虫和反爬虫技术研究
队列里的小秘密
Jerry&Judy:苏州印象是彩色的,四季分明时令如期而至
在队列里
利用爬虫技术的Geo-Gnutel la VANET流量采集
一首春季时令菜 差点要了宝宝的命……
丰田加速驶入自动驾驶队列