首先打开携程所有北京的酒店http://hotels.ctrip.com/hotel/beijing1


简简单单,源代码中包含我们需要的酒店数据,你以为这样就结束了?携程的这些数据这么廉价地就给我们得到了?事实并不是如此,当我们点击第二页的时候出现问题:虽然酒店的数据改变了,但是我们发现该网页的网址却没有改变,这也就造成了源代码中酒店的数据不改变,还是第一页的数据,如下图所示。我们遇到的第一个问题就是怎么获取所有数据的url,于是我们要换种思路,看看能不能从源代码中再获取一些有用的信息,比如输入网址让其页面改变,且源代码也改变显示我们需要的数据。

如下图所示,在翻页所对应的源代码中,我们发现在不同的页面对应不同的链接,比如第二页,第三页,第四页分别为
href=“http://hotels.ctrip.com/hotel/beijing1/p2” ,
href=“http://hotels.ctrip.com/hotel/beijing1/p3”,
href=“http://hotels.ctrip.com/hotel/beijing1/p4”,
点开这些链接我们看到酒店别的数据,不同的链接数据不同,而且在源代码中也得到了所需要爬取的数据结果,于是我们可以得到了在不同的数据的ur链接规律。
分析到这里可以先把所有构造url的代码和向服务器发送请求的函数写下来:

服务器发送请求的函数

def get_page(url):try:r=requests.get(url,headers=headers) r.raise_for_status()  #这行代码的作用是如果请求失败,那就执行exceptr.encoding=r.apparent_encoding  #防止出现乱码现象return r.text  #将返回对象的文本作为返回值except Exception as e: #找出失败的原因print(e)

构造每一页的url:

basic_url='http://hotels.ctrip.com/hotel/beijing1/p'
urls=[basic_url + str(i) for i in range(1,10)]  #所有url都urls里。

接下来就是提取数据了:
定义一个提取数据的函数

def get_info(page):try:names=re.findall(r'hotel_item_pic.*?title="(.*?)"',page,re.S)  #酒店名称locations=re.findall(r'<p class="hotel_item_htladdress">(.*?) <a href="javascript',page,re.S)  #酒店地址for i in range(len(locations)):   #清洗数据if '】' in locations[i]:locations[i]=locations[i].split('】')[1]scores=re.findall(r'"hotel_value">(.*?)</span>',page,re.S)  #酒店评分prices=re.findall(r'<span class="J_price_lowList">(.*?)</span>',page,re.S) #酒店价格recommends=re.findall(r'009933.*?>(.*?)</span>用户推荐',page,re.S) #推荐比例peoples=re.findall(r'FF9900.*?>(\d+)</span>位住客点评',page,re.S)   #推荐人数for name,location,score,price,recommend,people in zip(names,locations,scores,prices,recommends,peoples):data={}   #将每个酒店的信息保存为字典形式data['name']=namedata['score']=scoredata['price']=pricedata['recommend_ratio']=recommenddata['people_num']=peopledata['location']=locationprint(data)yield data


现在就可以写主程序了,将所有的函数都调用起来:

DATA=[]      #建一个空列表,为了储存所有提取出来的酒店数据
for i in range(1,100):url=basic_url + str(i)page=get_page(url)   print('request data from:' + url)   #主要是为了显示进度time.sleep(50)    #每请求一次服务器就暂停50s,请求数据太快会被服务器识别为爬虫datas=get_info(page)for data in datas:DATA.append(data)       #将数据添加到DATA列表里,为下一步保存数据使用

最后将爬取到的数据保存在Excel表格中:

f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'name') #第一行第一列
sheet01.write(0,1,'score')
sheet01.write(0,2,'price')
sheet01.write(0,3,'recommand_ratio')
sheet01.write(0,4,'people_num')
sheet01.write(0,5,'location')
#写内容
for i in range(len(DATA)):sheet01.write(i+1,0,DATA[i]['name'])sheet01.write(i+1,1,DATA[i]['score'])sheet01.write(i+1,2,DATA[i]['price'])sheet01.write(i+1,3,DATA[i]['recommend_ratio'])sheet01.write(i+1,4,DATA[i]['people_num'])sheet01.write(i+1,5,DATA[i]['location'])print('$',end='')
f.save(u'E:\\爬虫\\@爬虫教程\\数据\\携程酒店.xls')

任务完成!

爬虫第六课:爬取携程酒店数据相关推荐

  1. Java数据爬取——爬取携程酒店数据(二)

    在上篇文章Java数据爬取--爬取携程酒店数据(一)爬取所有地区后,继续根据地区数据爬取酒店数据 1.首先思考怎样根据地域获取地域酒店信息,那么我们看一下携程上是怎样获得的. 还是打开http://h ...

  2. Java数据爬取——爬取携程酒店数据(一)

    最近工作要收集点酒店数据,就到携程上看了看,记录爬取过程去下 1.根据城市名称来分类酒店数据,所以先找了所有城市的名称 在这个网页上有http://hotels.ctrip.com/domestic- ...

  3. JAVA爬虫爬取携程酒店数据selenium实现

    在爬取携程的时候碰到很多的壁垒,接下来分析所有过程 1.根据以往经验最初想到用jsoup去解析每个HTML元素,然后拿到酒店数据,然后发现解析HTML根本拿不到id为hotel_list的div,所以 ...

  4. Python3+Scrapy通过代理爬取携程酒店数据

    目标:通过爬取酒店信息保存至本地mysql数据库中 目标网址:https://hotels.ctrip.com/hotel/Haikou42 首先新建scrapy项目 命令行输入:crapy star ...

  5. python爬取携程酒店信息_不写代码玩转爬虫实例(3) - 抓取携程酒店信息

    背景需求 有不少朋友问永恒君携程网站的酒店信息怎么抓取,今天这篇文章来分享一下使用web scraper来快速实现抓取携程酒店信息. 例如,在携程官网搜索北京 密云水库的酒店信息, 可以搜索到非常多的 ...

  6. pyhton爬虫(12)——抓取携程酒店评论数据

    本文主要目标是抓取携程酒店基本信息和用户评论数据.具体来说,酒店基本信息包括:酒店名.酒店星级.酒店最低房价.用户推荐比.酒店总评分等:用户评论数据包括:用户评论时间,用户评分,评论内容等. 实现代码 ...

  7. python 携程_python爬取携程和蚂蜂窝的景点评论数据\python爬取携程评论数据\python旅游网站评论数...

    本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.同时欢迎加入社交媒体数据交流群:99918768 前言 为 ...

  8. 最新爬取携程酒店信息上:思路讲解

    本以为携程的信息很好爬,但是在我目前能力一般的时候,经过尝试,发现了携程真的有太多坑了,虽然说代码和大佬比起来不是最优的,但是可以完成爬取任务. 在这里记录一下本次学习过程,为后人乘凉. 要爬取所有的 ...

  9. python携程酒店评论_Python基于selenium爬取携程酒店评论信息

    爬取站点 任意一个携程酒店的详细链接,这里给出了四个,准备开四个线程爬取: https://hotels.ctrip.com/hotel/6278770.html#ctm_ref=hod_hp_hot ...

最新文章

  1. 函数式思维: 利用 Either 和 Option 进行函数式错误处理 类型安全的函数式异常...
  2. 偏移shaderuv_Unity Shader UV平移、旋转、缩放效果
  3. H5前端框架推荐合集 (转)
  4. ibm刀片服务器显示器切换,IBM X240 刀片 怎么连上显示屏呢
  5. PHP服务器环境打开配置文件
  6. Java相关面试题总结+答案(一)
  7. 【转载保存】lucene正则查询使用注意
  8. STL---二分查找、去重、全排列
  9. ubuntu服务器系统管理软件,安装 Webmin 来管理你的 Ubuntu 主机
  10. 给C#学习者的建议 - CLR Via C# 读后感
  11. 直流无刷电机无感检测电路原理
  12. 交通标志识别系统(TSR)
  13. docx文档文字怎么加边框,WORD文档给文字加的边框,如何调大小
  14. web前端知识——常见布局方案、文章排版、图片排版、某宝列表
  15. 微信公众号开发-取得AccessToken
  16. p图软件pⅰc_pic修图软件下载-pic修图 安卓版v16.4.52-PC6安卓网
  17. 怎样在python安装open cv_python 安装+open cv
  18. NDK学习笔记<六> 反编译现成的项目,调用该项目的so文件
  19. 集合高德地图搜索--导出Excel数据 工具
  20. Android第三方流式布局FlowLayout简单实用(搜索历史记录)

热门文章

  1. [网络安全学习篇附]:批处理与简单的病毒
  2. 博弈论——浙江大学蒋文华笔记
  3. 人工智能 漆桂林_东南大学计算机科学与工程学院硕导介绍:漆桂林
  4. js装修计算器java代码_JavaScript代码实现简单计算器
  5. 最大团算法(Maximum Clique)
  6. Chrome 自动化交互利器:用 tampermonkey 向页面注入自定义 Javascript
  7. 方法(Methods)
  8. [转]交流电机与直流电机比较
  9. 银行自助设备详细介绍(二)——多媒体查询机
  10. 21.7.26日报:指纹浏览器基本搞定