• Python 爬取美团酒店信息


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

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

    环境:

      python 3.6

    主要问题:

    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()

    运行后结果如下图:

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

  • 相关阅读:
    泛型
    Java反射及注解
    Java之线程与进程
    线程池
    HashMap、ConcurrentHashMap解析
    基于Opentracing+Jaeger全链路灰度调用链(转载)
    SpringBoot 开发案例之参数传递的正确姿势
    以np.concatenate为主题,谈谈numpy数组按维度合并的问题
    为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
    [C++面试题]之字符串(转)
  • 原文地址:https://www.cnblogs.com/clv5/p/9004793.html
Copyright © 2020-2023  润新知