事由:近期和朋友聊天,聊到黃山酒店事情,需要了解一下黃山的酒店情況,然后就想着用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()
運行后結果如下圖:
此部分僅因興趣編寫,還有很多未考慮,后期可以進行多層爬取,以及爬取更多的內容。