山东大学创新项目实训个人工作日志(十七)

景点门票数据的整合和组织
主要实现的是景点门票的后四个平台(去哪儿、同程、途牛、携程)的数据的整合。
去哪儿:

    def search_spots(self, keyword, city):
        '''
        查询景点门票,核心方法
        :param keyword:
        :param city:
        :return:
        '''
        Ncity = city.replace('市', '').replace('县', '').replace('省', '')
        '''如果获取失败,则重试一次'''
        try:
            url = 'https://piao.qunar.com/ticket/list.htm?keyword='+Ncity+keyword+'&region='+self.getCityUrl(city)+'&from=mpl_search_suggest&page='
        except:
            try:
                url = 'https://piao.qunar.com/ticket/list.htm?keyword=' + Ncity + keyword + '&region=' + self.getCityUrl(
                    city) + '&from=mpl_search_suggest&page='
            except:
                return
        p = 1
        try:
            while (1):
                html = self.getHtml(url + str(p))
                soup = BeautifulSoup(html, "html.parser")
                div = soup.find_all('a', attrs={'data-click-type': 'l_title','class':'name'})
                if len(div) == 0:
                    break
                for s in div:
                    # 景点名称,门票(名称name,类别type,价格price,url,已售buy,旅行社from,可退isReturnable,预定时间bookTime,出票时间outTime,
                    # 可用时间useTime,说明discription)
                    title = s.string
                    result = fuzz.token_sort_ratio(title, keyword)
                    if result <= 20:
                        continue
                    href = 'https://piao.qunar.com'+s['href']
                    dis = []
                    id = self.get_ticket_id(href)
                    u = 'https://piao.qunar.com/ticket/detail/getTickets.json?sightId=455895&from=detail&supplierId='
                    u = u.replace('455895', id)
                    dicts = json.loads(self.getHtml(u))
                    ls = dicts['data']['groups']
                    slist = {}
                    '''解析字典类型的数据'''
                    for l in ls:
                        if l['typeName']=='门票':
                            infos = l['shelfVos']
                            for info in infos:
                                tickets = info['firstLvTicketTypeVos']
                                for ticket in tickets:
                                    types = ticket['ticketTypes']
                                    for type in types:
                                        typeName = type['typeName']
                                        tis = type['tickets']
                                        for ti in tis:
                                            '''这是最小的一条门票的数据'''
                                            ttitle = ti['title']
                                            price = ti['qunarPrice']
                                            isreturn = ti['canRefundType']
                                            buyurl = ti['bookingUrl']
                                            fromw = '去哪儿网 '+ti['supplierName']
                                            booktime = ti['bookAtAnyTimeStr']
                                            dis = ''
                                            '''数据合并'''
                                            slist.setdefault(typeName, [])
                                            slist[typeName].append(
                                                {'name': ttitle, 'type': typeName, 'price': price, 'url':buyurl,
                                                 'buy': '', 'from': fromw, 'isReturnable': isreturn,
                                                 'bookTime': booktime, 'outTime': '', 'useTime': '',
                                                 'discription': dis})
                    self.spotsInfo[title] = slist
                # print(self.spotsInfo)
                    # self.tickets.append(dis)
                    # self.spots.append([title,href])
                p = p + 1
        except:
            traceback.print_exc()
        self.done = True
        # print(self.tickets)
        # print(self.spots)

同程:

    def search_spots(self, keyword, city):
        '''

        :param keyword: 关键词
        :param city: 在哪所城市搜索
        :return:
        '''
        Ncity = city.replace('市', '').replace('县', '').replace('省', '')
        url = 'https://so.ly.com/scenery?q='+Ncity+keyword
        p = 1
        try:
            html = self.getHtml(url)
            soup = BeautifulSoup(html,"html.parser")
            divs = soup.find_all('div',{'class':'list_l'})
            for div in divs:
                sid = div.find('div',{'class':'s_info'})['sid']
                title = div.find('a',{'class':'sce_name goFinal'})['title']
                '''筛选无关信息'''
                result = fuzz.token_sort_ratio(title, keyword)
                if result <= 20:
                    continue
                detailurl = 'https://so.ly.com/scenery/AjaxHelper/SceneryPriceFrame.aspx?action=GETNEWFRAMEFORLIST&showCount=2&ids='+str(sid)+'&isSimple=1&priceList=1&tabself=1&tabHotel=1&isGrap=1&nobookid=&isyry=1&YpState=1&lon=0&lat=0&isforegin=0&isNewSearch=true&iid=0.398138641670454'
                detailhtml = self.getHtml(detailurl)
                ticketInfo = json.loads(detailhtml)
                buyurl = 'https://www.ly.com/scenery/BookSceneryTicket_'+str(sid)+'.html'
                SceneryPrices = ticketInfo['SceneryPrices']
                # print(title)
                slist = {}
                for SceneryPrice in SceneryPrices:
                    types = SceneryPrice['ChannelPriceModelEntityList']
                    for type in types:
                        typename = type['ConsumersTypeName']
                        ChannelPriceEntityList = type['ChannelPriceEntityList']
                        for ChannelPriceEntity in ChannelPriceEntityList:
                            ttitle = ChannelPriceEntity['TicketName']
                            price = ChannelPriceEntity['AmountAdvice']
                            '''门票详细描述'''
                            dis = '入园方式:\n'+ChannelPriceEntity['GetTicketMode']
                            dis = dis + '预订说明:\n'+parse.unquote(ChannelPriceEntity['PriceBookRemark'])
                            dis = dis + '预订时间:\n'+ChannelPriceEntity['PriceTimeLimit']
                            dis = dis+'包含项目:\n'+ChannelPriceEntity['ContainedItems']
                            dis = dis+'退改规则:\n'+ChannelPriceEntity['RefundModifyRule']
                            ttypename = ChannelPriceEntity['ConsumersTypeName']
                            booktime = ChannelPriceEntity['BookTime']
                            dis = dis+'商家信息:\n'+ChannelPriceEntity['SupplierBaseInfo']['SupplierName']
                            '''数据合并'''
                            slist.setdefault(ttypename, [])
                            slist[ttypename].append(
                                {'name': ttitle, 'type': ttypename, 'price': price, 'url': buyurl,
                                 'buy': '', 'from': '同程旅游', 'isReturnable': '',
                                 'bookTime': booktime, 'outTime': '', 'useTime': '',
                                 'discription': dis})
                self.spotsInfo[title] = slist
            # print(self.spotsInfo)

                # print(price)
        except Exception as e:
            print(e)
        self.done = True

途牛:

    def search_spots(self, keyword, city):
        '''
        核心方法
        :param keyword: 关键词
        :param city: 城市
        :return:
        '''
        try:
            cityUrl = self.getCityUrl(city)
        except:
            '''失败则重试一次'''
            try:
                cityUrl = self.getCityUrl(city)
            except:
                return
        Ncity = city.replace('市','').replace('县','').replace('省','')
        url = 'https://s.tuniu.com/search_complex/ticket-'+cityUrl+'-0-'+Ncity+keyword+'/'
        p = 1;
        try:
            while (1):
                html = self.getHtml(url + str(p))
                soup = BeautifulSoup(html, "html.parser")
                div = soup.find('div', {'class': 'thelist'})
                if div is None:
                    break
                spot = div.find_all('li')
                for s in spot:
                    slist = {}
                    title = s.find('dl', {'class': 'detail'}).find('p',{'class':'title ticket'}).text.replace('\n','').replace(' ','')
                    result = fuzz.token_sort_ratio(title, keyword)
                    if result <= 20:
                        continue
                    '''景点地址'''
                    address = s.find('dl', {'class': 'detail'}).find('dd').string.replace(u'\u3000',u'')
                    '''开放时间'''
                    opentime = s.find('dl', {'class': 'detail'}).find('dd', {'class': 'port'}).text.replace('\n','')
                    price = s.find('div', {'class': 'priceinfo'}).find('span',{'class':'tnPrice'}).text.replace('\n','').replace(' ','')
                    '''满意度'''
                    manyi = s.find('p',{'class': 'manyi_inner'}).text.replace('\n','').replace(' ','')
                    '''景点链接'''
                    href = 'https:'+(s.find('div',{'class':'theinfo ticket clearfix'}).find('a',{'class':'img'}))['href']
                    '''景点图片链接'''
                    imgsrc = 'https:'+(s.find('div',{'class':'theinfo ticket clearfix'}).find('img'))['data-src']
                    ticket = s.find('div',{'class': 'ticketlist'}).find_all('div',{'class': 'each-item'})
                    dis = []
                    for t in ticket:
                        '''景点门票处理'''
                        ticketTitle = t.find('span', {'class': 'ticketTitle'}).text
                        ticketPrice = t.find('span', {'class': 'tnPrice'}).text
                        ticketBookUrl = (t.find('form'))['action']
                        slist.setdefault('', [])
                        slist[''].append(
                            {'name': ticketTitle, 'type': '', 'price': ticketPrice, 'url': 'https:'+ticketBookUrl,
                             'buy': '', 'from': '途牛旅游', 'isReturnable': '',
                             'bookTime': '', 'outTime': '', 'useTime': '',
                             'discription': ''})
                        dis.append([ticketTitle,ticketPrice,ticketBookUrl])
                    # self.tickets.append(dis)
                    self.spotsInfo[title] = slist
                    self.spots[title] = {'title':title,'address':address,'opentime':opentime,'manyi':manyi,'href':href,'imgsrc':imgsrc}
                p = p + 1
        except:
            pass
        # print(self.spotsInfo)
        # print(self.spots)
        self.done = True

携程:

    def get_ticket(self):
        '''
        获取景点门票信息
        :return:
        '''
        id = self.detail_url.split('/')[-1]
        # print(id)
        ticket_url = f'https://piao.ctrip.com/ticket/dest/{id}?onlyContent=true&onlyShelf=true'
        # print(ticket_url)
        ticket_res = requests.get(ticket_url, verify=False, headers=self.headers).text
        # time.sleep(1)
        ticket_res = ticket_res.replace('\n','').replace(' ','')
        ticket_res = ticket_res[ticket_res.find('window.__INITIAL_STATE__')+25:ticket_res.find('window.__APP_SETTINGS__')]
        info = json.loads(ticket_res)
        ticketinfos = info['detailInfo']['ressHash']
        slist = {}
        for ticketinfo in ticketinfos.values():
            '''解析字典数据'''
            title = ticketinfo['name']
            price = ticketinfo['price']
            type = ticketinfo['saleunitinfo']['propleproperty']
            fromw = '携程旅游 '+ticketinfo['brandname']
            '''数据合并'''
            slist.setdefault(type, [])
            slist[type].append(
                {'name': title, 'type': type, 'price': price, 'url': self.detail_url,
                 'buy': '', 'from': fromw, 'isReturnable': '',
                 'bookTime': '', 'outTime': '', 'useTime': '',
                 'discription': ''})
        self.spotsInfo[self.title] = slist

八个平台的数据合并:

def merge2(spi, xc, name):
    '''
    把两个字典数据合并在一起
    :param spi:
    :param xc:
    :param name:
    :return:
    '''
    if len(name) == 0:
        spotsInfo = spi
    else:
        spotsInfo = {}
    for info in spi.keys():
        try:
            spotsInfo.setdefault(info, {})
            k = xc.spotsInfo[info]
            if len(name) == 0:
                spotsInfo[info][xc.name] = xc.spotsInfo[info]
            else:
                spotsInfo[info][name] = spi[info]
                spotsInfo[info][xc.name] = xc.spotsInfo[info]
            xc.spotsInfo.pop(info)
        except Exception as e:
            # print(e)
            if len(name) != 0:
                spotsInfo[info][name] = spi[info]
    for info in xc.spotsInfo.keys():
        spotsInfo.setdefault(info, {})
        spotsInfo[info][xc.name] = xc.spotsInfo[info]
    # print(spotsInfo)
    print('done')
    return spotsInfo


def merge(feizhu,xiecheng,tuniu,quna,lvmama,dahe,klook,tongcheng):
    '''
    把所有的平台的数据都合并在一起
    :param feizhu:
    :param xiecheng:
    :param tuniu:
    :param quna:
    :param lvmama:
    :param dahe:
    :param klook:
    :param tongcheng:
    :return:
    '''
    list = [feizhu,xiecheng,tuniu,quna,lvmama,dahe,klook,tongcheng]
    merged = False
    spotsInfo = {}
    while len(list)>0:
        l = list[0]
        if merged:
            spotsInfo = merge2(spotsInfo,list.pop(0),'')
        else:
            spotsInfo = merge2(list.pop(0).spotsInfo,list.pop(0),l.name)
            merged = True
    # print(spotsInfo)
    return spotsInfo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值