東隅已逝,桑榆非晚,
文章目錄
- 一、分析網頁
- 二、爬取酒店資訊
一、分析網頁
爬取美團網成都地區的酒店資訊
網站的頁面是 JavaScript 渲染而成的,我們所看到的內容都是網頁加載后又執行了JavaScript代碼之后才呈現出來的,因此這些資料并不存在于原始 HTML 代碼中,而 requests 僅僅抓取的是原始 HTML 代碼,
抓取這種型別網站的頁面資料,解決方案如下:
分析 Ajax,很多資料可能是經過 Ajax 請求時候獲取的,所以可以分析其介面,

在XHR里可以找到,Request URL有幾個關鍵引數,uuid和cityId是城市標識,offset偏移量可以控制翻頁,分析網頁發現,第x頁的offset為:(x-1)*20,limit表示每頁有20條資訊,startDay和endDay為當前的日期,

在Preview里可以找到每頁的20條資訊

模擬JavaScript渲染程序,直接抓取渲染后的結果,
selenium和pyppeteer爬蟲就是用的這種方法
二、爬取酒店資訊
import requests
import json
import openpyxl
import logging
from concurrent.futures import ThreadPoolExecutor
import random
import time
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
url = "https://ihotel.meituan.com/hbsearch/HotelSearch"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36",
"Referer": "https://hotel.meituan.com/chengdu"
}
wb = openpyxl.Workbook()
sheet = wb.active
sheet.append(['酒店名稱', '酒店地址', '酒店型別', '最低價', '評價', '評論數', '經度', '緯度'])
def hotel_data(x):
data = {
'utm_medium': 'pc',
'version_name': 999.9,
'cateId': 20,
'attr_28': 129,
'uuid': '5D4E443EC83DDD49B73F317921EAE16C7B492A634A67FA261773890F730A5932@1600263777783',
'cityId': 59,
'offset': x * 20,
'limit': 20,
'startDay': 20200916,
'endDay': 20200916,
'q': '', 'sort': 'defaults',
'X-FOR-WITH': '47zbBAV+k1e7QrnKt4lEVXrmtOE9w2OpFfGsKf539CDdXIw4r2V/qICcWVeNACGHWNbD6iL4huPyRVdkNJJwR6dqcoQMyzjUE3cQGWr6YZOwANQOlCSrZ7m1+aahwcnh/dTfaJLMZfxWaJQEISBuKbiMgDC8Vr4eaeWiYASkLl0ByB96MOUz7gfjUTbhlV0ZXvZ/ucwNcK3zxTQjmoBINsAY4HwpKQLpOV2IqV1CtPg=',
}
res = requests.get(url, headers=headers, params=data)
time.sleep(random.randint(1, 3))
results = json.loads(res.text)['data']['searchresult']
for con in results:
name = con['name'] # 酒店名稱
addr = con['addr'] # 酒店地址
star = con['hotelStar'] # 酒店型別
price = con['lowestPrice'] # 最低價
scoreIntro = con['scoreIntro'] # 評價
comments = con['commentsCountDesc'] # 評論數
lng, lat = con['lng'], con['lat'] # 經緯度
data = [name, addr, star, price, scoreIntro, comments, lng, lat]
sheet.append(data)
logging.info(data)
if __name__ == '__main__':
page = [i for i in range(56)]
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(hotel_data, page)
wb.save("hotel.xlsx")
程式運行成功,酒店資訊保存到了Excel,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/81592.html
標籤:其他
上一篇:(非常詳細適合超小白)Ubuntu16.04系統下搭載PyTorch深度學習環境-顯卡、cuda和torchvision包等安裝
