一、分析网页
爬取美团网成都地区的酒店信息
私信小编01即可获取大量Python学习资料
网站的页面是 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爬虫就是用的这种方法
二、爬取酒店信息"""@Author :叶庭云@Date :2020/9/16 15:01@CSDN :https://blog.csdn.net/fyfugoyfa"""import requestsimport jsonimport openpyxlimport loggingfrom concurrent.futures import ThreadPoolExecutorimport randomimport timelogging.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.activesheet.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。
添加上方▲技术, 在线咨询
复制微信号
声明
一、本站原创内容,其版权属于本网站所有。其他媒体、网站或个人转载使用时不得进行商业性的原版原式的转载,也不得歪曲和篡改本网站所发布的内容。如转载须注明文章来源。
二、本网站转载其它媒体作品的目的在于传递更多信息,并不代表本网站赞同其观点和对其真实性负责;如侵犯你的权益请告诉我们立即删除;其他媒体、网站或个人转载使用自负法律责任。
发表评论
2022-06-15 10:34:40回复