爬取去哪儿酒店信息及评论

2023-10-27

爬取去哪儿酒店信息及评论

第一步,获取城市列表

import requests
import json
import codecs

# 去哪儿城市列表
url = "https://touch.qunar.com/h-api/hotel/hotelcity/en"

s = requests.get(url)

file = codecs.open('./city.json','w','utf-8')

file.write(s.text)
file.close()

运行结果:

去哪儿城市列表

第二步 根据城市列表爬取酒店信息(以汉庭酒店为例)

需要注意两点:

1.请求时需要带数据
当前时间必须在fromDate--toDate之前
"b":{"bizVersion":"17",
"cityUrl":cityid,
"fromDate":fromDate,
"toDate":toDate,
"q":"汉庭酒店",
"qFrom":3,
"start":start,
"num":20,
"minPrice":0,
"maxPrice":-1,
"level":"",
"sort":0,
"cityType":1,
"fromForLog":1,
"uuid":"",
"userName":"",
"userId":"",
"fromAction":"",
"searchType":0,
"hourlyRoom":False,
"locationAreaFilter":[],
"comprehensiveFilter":[],
"channelId":1},
"qrt":"h_hlist",
"source":"website"}


2.以这个headers进行访问,cookie填你自己的cookie
headers = {
        "accept": "application/json, text/plain, */*",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9",
        "content-length": "389",
        "content-type": "application/json;charset=UTF-8",
        "cookie":"你的cookie",
        "origin": "https://hotel.qunar.com",
        "referer": r_url,
        "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
        }

上代码

import json
import requests
import datetime
import urllib.parse as p
import time
import codecs
import csv
import re
def get_session(cityid,city):
    fromDate = datetime.date.today().strftime("%Y-%m-%d")
    toDate = (datetime.date.today() + datetime.timedelta(days=1)).strftime("%Y-%m-%d")
    url = "https://hotel.qunar.com/cn/{}/?fromDate={}&toDate={}&cityName={}&from=qunarindex&cityurl=".format(
        cityid,fromDate,toDate,p.quote(city))
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
        "referer": "https://www.qunar.com/"

        }
    session = requests.session()
    res = session.get(url=url,headers = headers)
    return session,url,fromDate,toDate
def get_data(session,cityid,fromDate,toDate,start,url,headers):
    payload = {"b":
                   {"bizVersion":"17","cityUrl":cityid,"fromDate":fromDate,
                    "toDate":toDate,"q":"汉庭酒店","qFrom":3,"start":start,"num":20,
                    "minPrice":0,"maxPrice":-1,"level":"","sort":0,"cityType":1,
                    "fromForLog":1,"uuid":"","userName":"","userId":"",
                    "fromAction":"","searchType":0,"hourlyRoom":False,
                    "locationAreaFilter":[],"comprehensiveFilter":[],
                    "channelId":1},
                   "qrt":"h_hlist","source":"website"}
    data = json.dumps(payload)
    res = session.post(url=url,data=data,headers=headers)
    if start == 0:
        # print(json.loads(res.text))
        print (json.loads(res.text))
        return res,session,json.loads(res.text)["data"]["tcount"]
    else:
        return res,session
        
def get_pages(cityid,city):
    session,r_url,fromDate,toDate = get_session(cityid,city)
    url = "https://hotel.qunar.com/napi/list"
    headers = {
        "accept": "application/json, text/plain, */*",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9",
        "content-length": "389",
        "content-type": "application/json;charset=UTF-8",
        "cookie":"你的cookie",
        "origin": "https://hotel.qunar.com",
        "referer": r_url,
        "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
        }
    start=0
    res,session,end_num = get_data(session,cityid,fromDate,toDate,start,url,headers)
    with open("{}.csv".format(city),'a+',encoding="utf-8") as f:
                    f.write("name,url,city,seqno\n")
    for start in range(20,end_num,20):
        res,session = get_data(session,cityid,fromDate,toDate,start,url,headers)
        if res.status_code == 200:
            with open("{}.csv".format(city),'a+',encoding="utf-8") as f:
                    time.sleep(2)
                    # print(res.text)
                    hotels = json.loads(res.text)['data']['hotels']
                
                    # print(hotels[1])
                    for i in range(0,len(hotels)):
                        print(hotels[i]['seqNo'])
                        # exit()
                        seqNo = re.findall(cityid+'_(.*)',str(hotels[i]['seqNo']))
                        print(seqNo)
                        # exit()
                        f.write(hotels[i]['name']+','+'https://hotel.qunar.com/cn/'+cityid+'/dt-'+seqNo[0]+','+city+','+hotels[i]['seqNo']+'\n')
                
        else:
            print("获取数据失败")
        time.sleep(2)
def get_city():
    f = codecs.open('./city.json','r','utf-8')
    return json.loads(f.read())
if __name__=="__main__":

    d1 = get_city()
    for k in range(len(d1['data'])):
        items = d1['data'][k].items()
        for key,value in items:
            for j in range(10,len(value)):
                cityid = value[j]['cityUrl']
                city = value[j]['cityName']
                print(cityid)
                get_pages(cityid,city)

运行结果

酒店信息

第三步爬取酒店评论

import requests
import csv
import json


f= open(r'new.csv','r',encoding='gbk')
with open('remark1.csv','a+',encoding='utf-8') as f_remark:
        f_remark.write("name,star,feed,time\n")
reader = csv.reader(f)
for item in reader:
        print(reader.line_num)
        if reader.line_num == 1:
                continue
        if reader.line_num == 361:
                break
        if reader.line_num <236:
                continue
        print("当前内容:",item)
        headers = {
                "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
                "accept-encoding": "gzip, deflate, br",
                "accept-language": "zh-CN,zh;q=0.9",
                # "content-length": "389",
                # "content-type": "application/json;charset=UTF-8",
                "cookie":"你的cookje",
                # "origin": "https://hotel.qunar.com",
                "referer": item[1],
                "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
                }
        for i in range(100):
                # print(i)
                try:
                        url =" https://hotel.qunar.com/napi/ugcCmtList?hotelSeq={}&page={}&size=10".format(item[3],i+1)
                        response = requests.get(url=url,headers=headers)
                        # print(i)
                        res = json.loads(response.text)
                        # print(json.loads(res['data']['list'][0]['content'])['evaluation'])
                        for j in range(len(res['data']['list'])):
                                content = json.loads(res['data']['list'][j]['content'])
                                star = content['evaluation']
                                feed = content['feedContent'].replace('\n','').replace('\r', '').replace(',',',')
                                time = content['modtime']
                                # print(item[0],star,feed,time)
                                if(star=='' or feed=='' or str(time)==''):
                                        continue
                                with open('remark1.csv','a+',encoding='utf-8') as f_remark:

                                        f_remark.write(item[0]+','+str(star)+','+str(feed)+','+str(time)+'\n')
                                

                                print(feed)
                                
                except:
                        break
f_remark.close()
f.close()



        


运行结果

酒店评论

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬取去哪儿酒店信息及评论 的相关文章

  • Docker11: raft协议+弹性创建项目

    raft协议 问题 假设一个节点挂了 其他节点是否可用 Raft协议 保证大多数节点存活 gt 1 集群 gt 3 以下01 02 03 03 指的是四台服务器 将docker1机器停止 宕机 docker 01 systemctl sto
  • 【漏洞靶场】文件上传后端检测exif_imagetype()函数绕过--upload-labs

    一 漏洞描述 在upload labs第十六关 服务器exit imagetype 函数检测上传图片类型是否为白名单图片格式来验证上传文件合法性 可以通过制作图片马绕过 再配合文件包含漏洞解析文件来获取服务器配置信息 二 漏洞发现 先在本地
  • TP-Link Wi-Fi扩展器远程代码执行漏洞分析

    WiFi扩展器可以放大WiFi信号 主要用于大型或多层住宅 以及路由器信号无法覆盖家庭的情况下 扩展器的原理是从主路由器处获取WiFi信号 并广播道其他WiFi信号弱或没有信号的区域 IBM X Force安全研究人员 Grzegorz W
  • PHP常用加密算法

    PHP常用加密算法 md5 sha1 password hash 字符串编码 urlencode json encode serialize base64 原理 PHP应用 AES 加密流程 加密原理 PHP应用 RSA DES md5 m
  • rknn_server启动方法

    rknn server 是一个运行在板子上的后台代理服务 用于接收PC通过USB传输过来的协议 然后执行板端runtime对应的接口 并返回结果给PC 当rknn server没有启动 则在上位机和瑞芯微开发板的连扳调试 容易出现如下错误
  • python PyQt6学习笔记 有注释

    PyQt 当前日期和时间 from PyQt6 QtCore import QDate QTime QDateTime Qt now QDate currentDate print now print now toString Qt Dat
  • Winform使用DSO Framer控件嵌入office 异常总结及解决方法

    1 DSO Framer无法激活不可见或已禁用的控件 因为业务需求 执行了一次清空面板main panel所有控件 之后未向窗体面板main panel中添加过OfficeFramerControl 直接调用了OfficeFramerCon
  • "403 - 禁止访问: 访问被拒绝。 您无权使用所提供的凭据查看此目录或页面"的解决方案

    403 禁止访问 访问被拒绝 您无权使用所提供的凭据查看此目录或页面 的解决方案 打开IIS将此网站的默认文档设置一下即可解决 如果您的默认文档放在子文件夹中 可以在根目录下创建一个html文件跳转一下即可 跳转方法可以百度
  • 在卡内基梅隆大学 (Carnegie Mellon University) 就读是怎样一番体验?——Lina

    我觉得我无比适合回答这个问题 因为我是cmu里典型得一类人 我们来这里前 有着各种个样得背景 来了这里后 我们做了一个很重要的转变 学cs cmu是一个全民cs的地方 如果你在别的学校 你会看到ee的人问转cs难不难 在cmu 连学英语的人
  • 冒泡排序C++代码

    冒泡排序是一种比较简单的排序算法 它重复地走访过要排序的数列 一次比较两个元素 如果它们的顺序错误就把它们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 以下是 C 语言实现的冒泡排序代码 void bu
  • QLabel设置背景颜色或字体失效显示“无效样式表”解决办法

    点击ui中的label 右下角选择styleSheet添加样式表 样式表中 可以选择资源 改变背景颜色 改变字体 但是添加以后 显示样式表无效 如图 原因 无法识别资源类型 解决办法 添加资源类型 添加方法 1 点击每个按键的右上角箭头 选
  • js宏观任务和微观任务

    先来看这样一道面试题 async function async1 console log async1 start await async2 console log async1 end async function async2 cons
  • MySQL数据库函数与约束详解

    MySQL数据库函数与约束详解 MySQL数据库是一种功能强大的关系型数据库管理系统 提供了丰富的函数和约束来处理和保护数据 本篇博客将详细介绍MySQL数据库中的函数和约束 并提供实例演示其用法 函数 字符串函数 字符串拼接函数 CONC
  • 45度地图遮挡问题解决方案(cocos2d-x)

    最近一直在做45度斜视角游戏 也就是isometric等容地图 俗称2 5D 地图上物体的前后遮挡是我遇到的第一个问题 总结一下处理方法 遮挡问题 不知道术语 就是比如一个角色站在树后面 那么树要遮挡住角色的一部分 我是用实时修改zorde
  • Python神经网络:训练简单的分类器篇

    我们希望训练线性分类器 使其能够正确分类瓢虫或毛虫 在1 3节的图中 根据观察 我们知道要做到这一点 简单说来 就是要调整分界线的斜率 使其能够基于小虫的宽度和长度将两组点划分开来 我们如何做到这一点呢 我们无需研究一些最前沿的数学理论 让
  • 计算机操作鉴定所需设备,计算机操作员职业技能鉴定标准(高级)

    计算机操作员职业技能鉴定标准 一 职业概况 1 1 职业名称 计算机操作员 1 2 职业定义 使用电子计算机微机从事文字 图形 图像等信息处理工作及计算机系统操作 维护与管理的人员 1 3 职业等级 本职业共设三个等级 分别为初级 国家职业
  • 2014项目总结:一个比较失败的项目总结

    最近将会对今年所做的一些项目进行总结 里面基本都包含了一个项目所有的过程 一来为自己今年的年终总结提供些材料 其次也是希望在总结过程中能给自己带来些更多的启发和经验教训 同时也非常期望各位大牛能给些建议以及批评 让我获得更多的进步 谢谢 上
  • STL容器三 -- List 详解

    目录 目录 前言 一 STL List 的基本认识 1 1基本认识 1 2 list 双向迭代器 1 3一些list特有接口 二 模拟实现 2 1节点实现 2 2正向迭代器模板实现 2 2 1list迭代器 非原生指针的认识 2 2 2指针
  • 主流编程语言的底层实现是什么以及gcc,clang,llvm等编译器的区别

    文章目录 一 前言 二 c和c 和c 的区别 1 高级语言和低级语言 2 c 和 c 和 c 的区别 1 C语言 2 C 三 各主流语言的底层实现 1 python的底层实现 2 java的底层实现 3 php的底层实现 4 js的底层实现
  • .NET实现字符串base64编码

    using System using System Text using System IO using System Security using System Security Cryptography namespace Tgnet

随机推荐

  • 分页出现数据重复的解决方案

    用户量急剧上升中 偶尔会发现这么一个问题 就是下一页的数据中总会出现上一页的几条数据 为什么会造成这个问题呢 用户在查询第一页的时候 停留了一下 然后在这段时间内 又有两个用户注册了 然后请求第二页的数据的时候 排序的时候 两个新用户排在了
  • “kube-flannel.yml“: daemonsets.apps “kube-flannel-ds“ already exists

    Error from server AlreadyExists error when creating kube flannel yml podsecuritypolicies policy psp flannel unprivileged
  • 帝国cms【官方教程系列教程一】 首页模板制作

    帝国cms首页模板是指网站首页的模板 index html 修改首页模板 1 登录后台 单击 模板 菜单 选择 首页模板 子菜单 进入修改首页模板界面 2 进入修改首页模板界面 3 首页模板支持的变量说明 news url 网站地址 参数设
  • 存储器系统课后习题参考答案

    1 解释概念 主存 辅存 Cache RAM SRAM DRAM ROM PROM EPROM EEPROM CDROM Flash Memory 答 主存 主存储器 用于存放正在执行的程序和数据 CPU可以直接进行随机读写 访问速度较高
  • MySQL 哈希索引、空间数据索引、全文索引

    1 哈希索引 哈希索引基于哈希表实现 仅支持精确匹配索引所有列的查询 对于每行数据 存储引擎都会对所有的索引列计算出一个哈希码 哈希索引将所有的哈希码存储在索引中 同时保存指向每个数据行的指针 1 1 存储结构 常见的存储引擎中 MEMOR
  • DateUtil 工具类整理一些自己用到过得,有点逻辑处理的方法

    获取当前的年分 return public static int getSeasonId Calendar cal Calendar getInstance return cal get Calendar YEAR 获得本周一与当前日期相差
  • 硬件系统工程师宝典(19)-----原理图封装库,你画对了吗?

    各位同学大家好 欢迎继续做客电子工程学习圈 今天我们继续来讲这本书 硬件系统工程师宝典 上篇我们说到PCB制造过程中 不同的焊接工艺 布局元器件之间的距离要满足不同的要求 PCB走线时要从焊盘中心走线并且宽度小于焊盘宽度 以及丝印排布的建议
  • OpenAI 选择这家成立2年的8人团队做什么?

    当地时间 8 月 16 日 OpenAI 发布公告称收购了 Global Illumination 的团队 此笔交易更成为 OpenAI 自 2015 年成立以来首次对外收购 但并未公开交易涉及金额 据悉 该团队将参与 OpenAI 核心产
  • Win10竟然内置了一台虚拟机

    第一步 打开win10自带的虚拟机Hyper V 需要 win10系统 1 点击windows键 e键打开文件资源管理器 右击此电脑 gt 选择属性 gt 打开控制面板 2 选择控制面板主页 gt 选择程序与功能 3 点击启用或关闭Wind
  • 入住倒计时

    经过辛辛苦苦的三个月的时间 房子总算硬装结束 入住时间也排上了日程 查了查老黄历 西历2008 09 14即公历8月15 中国的中秋节 日子不错 是入住的黄道吉日 准备买点鞭炮小热闹一下 一来冲冲三个月来的劳累 烦躁的情绪 二来也算献给一期
  • springboot-配置类学习

    开发SpringBoot应用时经常涉及到配置文件 平时只是知道使用 ConfigurationProperties来注解类 或者使用 Value来获取配置值 通过 EnableConfigurationProperties来将配置类作为be
  • [正能量系列]失业的程序员(二)

    http blog csdn net shenyisyn article details 8634185 闹钟响 迷迷糊糊的我砸了一下开关 竟然把闹钟砸坏了 昨天接到学姐的电话 说是帮我介绍了一个钢管制造厂企业型宣传网站的业务 难度不大主要
  • 第六十六篇 三种常见的电路输出OC/OD和推挽

    1 OC输出 集电极开路输出 所谓OC就是open collector 字面理解就是collector极开路状态 既是集电极什么负载都不接 保持开路状态 在集电极开路输出OC结构电路中 类似上图 如果Q2断开的话 那么输出OC门的状态不可知
  • elementui中的tree组件相关操作集合

    目录 1 刷新指定节点 2 自定义过滤方法 3 新增子节点 4 编辑节点名 5 拖拽节点 6 某节点高亮 7 总结 8 组件整体的代码 1 刷新指定节点 node节点有一个loaded的属性 用来存储该节点是否展开过 刷新指定节点的思路 无
  • How to use appreciation and lie

    appreciation 1 理解 同情 体谅 I had no apprecation of the prombles you faced 我没有体谅到你当前所面临的困难 2 感谢 感谢 Please accept this gift i
  • PowerShell混淆相关

    相关技术文章 2016 05 26 利用机器学习检测恶意PowerShell https bbs pediy com thread 230002 htm 2018 11 09 FireEye 基于机器学习的模糊命令行检测 https www
  • git log 记录 patch

    如何打tag git tag a KPN FW v1 02 01 build01 m KPN FW v1 02 01 build01 git push origin tags git查看历史记录及修改内容 git whatchanged h
  • 《UNIX环境高级编程》学习笔记

    Unix环境高级编程 学习笔记 第一章 NUIX基础知识 1 5输入和输出 文件描述符通常是一个非负整数 用以标识一个特定进程正在访问的文件 运行一个新程序 所有shell会为其打开3个文件描述符 标准输入 输出 错误 不带缓冲的I O 标
  • HTML、CSS、JavaScript学习总结

    学习总结 HTML 网站开发的主要原则是 用标签元素HTML描述网页的内容结构 用CSS描述网页的排版布局 用JavaScript描述网页的事件处理 即鼠标或键盘在网页元素上的动作后的程序 HTML Hyper Text Mark up L
  • 爬取去哪儿酒店信息及评论

    爬取去哪儿酒店信息及评论 第一步 获取城市列表 import requests import json import codecs 去哪儿城市列表 url https touch qunar com h api hotel hotelcit