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

運行后結果如下圖:

 

此部分僅因興趣編寫,還有很多未考慮,后期可以進行多層爬取,以及爬取更多的內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM