clv5

Python 爬取美团酒店信息

事由:近期和朋友聊天,聊到黄山酒店事情,需要了解一下黄山的酒店情况,然后就想着用python 爬一些数据出来,做个参考

主要思路:通过查找,基本思路清晰,目标明确,仅仅爬取美团莫一地区的酒店信息,不过于复杂,先完成一个小目标

 

 

主要问题:

1. 在爬取美团黄山酒店第一页后,顺利拿到想要的信息,但在点击第二页后,chrome中检查信息能够看见想要的信息,但是查看源代码却没有,思考后,应该是Ajax动态获取的,然后查找办法,最终通过selenium模拟浏览器,然后进行爬取
2. 标签查找,通过chrome进行分析整体网站标签信息后,对某一个标签的class未清楚认识,导致错误认识,消耗比较长的调试时间

代码如下:

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import xlwt

url = 'http://hotel.meituan.com/huangshan/'

#获取酒店分页信息,返回最大页码
def get_page_num(url):
    html = requests.get(url).text
    soup = BeautifulSoup(html,'lxml')
    page_info = soup.find_all('li',class_='page-link')      #获取酒店首页的页面导航条信息
    page_num = page_info[-1].find('a').get_text()           #获取酒店页面的总页数
    return int(page_num)                                        #返回酒店页面的总页数


#获取所有酒店详细信息,包含酒店名称,链接,地址,评分,消费人数,价格,上次预定时间
def get_hotel_info(url):
    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap['phantomjs.page.settings.userAgent'] = ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36')    #设置userAgent,可以从浏览器中找到,用于反爬虫禁止IP
    browser = webdriver.PhantomJS("/Users/chenglv/phantomjs-2.1.1-macosx/bin/phantomjs", desired_capabilities=dcap)         #指定phantomjs程序路径
    browser.get(url)
    hotel_info = {}
    hotel_id = ['酒店名','网址','酒店地址','评价','消费人数','价格','上次预约时间']
    col_num = 1
    page_num = 1

    book = xlwt.Workbook(encoding='utf-8',style_compression=0)          #创建excel文件
    sheet = book.add_sheet('hotel_info',cell_overwrite_ok=True)         #创建excel sheet表单


    for i in range(len(hotel_id)):      #写入表单第一行,即列名称
        sheet.write(0,i,hotel_id[i])    #excel中写入第一行列名

    while(page_num < get_page_num(url)+1):

        #获取一个页面的所有酒店信息
        for item in browser.find_elements_by_class_name('info-wrapper'):
            hotel_info['name'] = item.find_element_by_class_name('poi-title').text
            hotel_info['link'] = item.find_element_by_class_name('poi-title').get_attribute('href')
            hotel_info['address'] = item.find_element_by_class_name('poi-address').text.split(' ')[1]
            hotel_info['star'] = item.find_element_by_class_name('poi-grade').text
            hotel_info['consumers'] = item.find_element_by_class_name('poi-buy-num').text
            hotel_info['price'] = item.find_element_by_class_name('poi-price').text
            hotel_info['last_order_time'] = item.find_element_by_class_name('last-order-time').text

            #将当前页面中的酒店信息获取到后,写入excel的行中
            for i in range(len(hotel_info.values())):
                sheet.write(col_num,i,list(hotel_info.values())[i])
            col_num+=1

        browser.find_element_by_class_name('paginator').find_element_by_class_name('next').find_element_by_tag_name('a').click()        #一个页面写完后,通过点击"下一页"图标至下一页,继续获取
        page_num += 1
    book.save('hotel_info_huangshan.csv')


def main():
    get_hotel_info(url)


if '__main__' == __name__:
    main()

运行后结果如下图:

 

此部分仅因兴趣编写,还有很多未考虑,后期可以进行多层爬取,以及爬取更多的内容。

 

posted on 2018-05-07 20:34 clv 阅读(...) 评论(...) 编辑 收藏

相关文章: