python爬取携程酒店数据

首先打开携程所有北京的酒店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()  #这行代码的作用是如果请求失败,那就执行except
        r.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']=name
            data['score']=score
            data['price']=price
            data['recommend_ratio']=recommend
            data['people_num']=people
            data['location']=location
            print(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') 

任务完成!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41779359/article/details/86162674
今日推荐