吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3945|回复: 37
收起左侧

[Python 原创] 全国旅游监管平台爬数据比对导游信息

  [复制链接]
wangwei0511 发表于 2023-8-17 11:48
本帖最后由 wangwei0511 于 2023-8-17 15:08 编辑

鉴于大家不清楚作用,我说下场景吧。某个景区带团导游免费(购买0元门票),那么就要把这些导游的身份证信息录入到白名单,让导游能够买到票。
怎么证明是不是导游呢?就需要用报备的导游信息去https://mr.mct.gov.cn/(全国旅游监管网站)去进行查询比对,如果真实导游,就录入系统,然后能够买到导游票。
这个程序就是从数据库获取信息至全国旅游监管网站去比对的过程,并把比对的相关信息更新至数据库。
数据库的信息是导游自己信息报备的。
——————————————————————————————————————————————目的:实现从数据库到获取导游信息,和国家旅游局的导游查询信息进行比对,然后将比对结果写入数据库。
场景:某景区带团报备的导游免票,就需要核实报备的导游是否是真实的导游、故通过此代码进行比对。
需要注意的点:旅游局接口有防爬,所以需要有间隔时常,及多次重试机制,目前这个稳定运行半年没问题。
[Python] 纯文本查看 复制代码
import mysql.connector
import requests
import json
import random
import time
import datetime

def query():
    USER_AGENT_LIST = [
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
        'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5'
    ]
    headers = {
        'User-Agent': random.choice(USER_AGENT_LIST),
        'Content-Type': 'application/json; charset=utf-8'
    }
    #数据库信息
    mydb = mysql.connector.connect(
        host="",
        user="",
        password="",
        database=""
    )

    mycursor = mydb.cursor()

    mycursor.execute("SELECT id, guide_cert_no FROM guide_info WHERE query_results IS NULL AND guide_cert_no IS NOT NULL")

    current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #获取时间
    print("导游正常查询:", current_time)  #看是否执行查询
    for row in mycursor.fetchall():
        current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        print("导游正常查询及执行:", current_time)  #看是否执行查询
        id = row[0]
        guide_cert_no = row[1]
        print(f"第 {id}行, 导游证号: {guide_cert_no}")
        data = {
                    'type': '3',
                    'value': guide_cert_no
                }
        print(data)
        response = requests.post('https://mr.mct.gov.cn/data/guide/verify', headers=headers, data=json.dumps(data))
        time.sleep(0.8)
        result = json.loads(response.text)
        print(result)
            # 每遍历19次暂停42秒
        if (id + 1) % 19 == 0:
            print("暂停42秒...")
            time.sleep(42)
        if 'error' in result:
            max_retry = 2  # 最大重试次数为2次
            retry_count = 0  # 当前重试次数初始化为0

            # 循环执行请求直到结果不出错或超过最大重试次数
            while retry_count < max_retry:
                response = requests.post('https://mr.mct.gov.cn/data/guide/verify', headers=headers, data=json.dumps(data))
                time.sleep(0.8)  # 每次请求之间间隔0.8秒
                result = json.loads(response.text)
                print(result)
                if 'error' in result:  # 如果结果中包含错误信息
                    retry_count += 1  # 当前重试次数加1
                    time.sleep(20)  # 等待10秒后再次执行请求
                else:  # 如果结果中不包含错误信息
                    break  # 跳出循环
            else:  # 如果循环执行了max_retry次仍然没有成功,则输出错误信息
                result = json.loads(response.text)
                reason = result['reason']
                print(reason)
                #获取时间并显示,写入的文件。
                now = datetime.datetime.now()  # 获取当前时间和日期
                formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")  # 将时间格式化为"YYYY-MM-DD HH:MM:SS"格式
                update_query = f"UPDATE guide_info SET query_results='{reason}', query_time='{formatted_now}' WHERE id={id}"
                mycursor.execute(update_query)
                mydb.commit()
        else:
            data = result['data']
            if 'pic_avatar' in data:
                pic_avatar = data['pic_avatar']
                user_name = data['user_name']
                star_level = data['star_level']
                guide_card = data['guide_card']
                guide_id = data['guide_id']
                level = data['level']
                leader_card = data['leader_card']
                leader_type_name = data['leader_type_name']
                languages = data['languages']
                comp_name = data['comp_name']
                qr = data['qr']
                issued_date = data['issued_date']
                expired_date = data['expired_date']
                pinyin_name = data['pinyin_name']
                qr_img_url = data['qr_img_url']

                ##查询数据库中导游的姓名
                select_query = f"SELECT guide_name FROM guide_info WHERE id = {id}"
                mycursor.execute(select_query)
                result = mycursor.fetchone()
                guide_name = result[0]
                now = datetime.datetime.now()  # 获取当前时间和日期
                formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")  # 将时间格式化为"YYYY-MM-DD HH:MM:SS"格式
                #写入到数据库
                update_query = f"UPDATE guide_info SET query_results='查询成功', pic_avatar='{pic_avatar}', user_name='{user_name}', star_level='{star_level}', guide_card='{guide_card}', guide_id='{guide_id}', level='{level}', leader_card='{leader_card}', leader_type_name='{leader_type_name}', languages='{languages}',comp_name='{comp_name}', qr='{qr}', issued_date='{issued_date}', expired_date='{expired_date}', pinyin_name='{pinyin_name}', qr_img_url='{qr_img_url}', query_time='{formatted_now}' WHERE id={id}"
                mycursor.execute(update_query)
                mydb.commit()
                
                if user_name and user_name == guide_name:
                    mycursor.execute(f"UPDATE guide_info SET check_name='姓名正确' WHERE id={id}")
                    #可以使用以下代码来查询当前行的 guide_id_card 值:
                    select_query = f"SELECT guide_id_card FROM guide_info WHERE id = {id}"
                    mycursor.execute(select_query)
                    result = mycursor.fetchone()
                    guide_id_card = result[0]

                    # 查询数据库中duplicate_queries列的所有值,排除空值
                    mycursor.execute("SELECT duplicate_queries FROM guide_info WHERE duplicate_queries IS NOT NULL AND duplicate_queries != ''")
                    myresult = mycursor.fetchall()

                    result_str = guide_name + guide_cert_no + guide_id_card

                    myresult_list = []
                    for row in myresult:
                        myresult_list.append(row[0])

                    result_str = guide_name + guide_cert_no + guide_id_card
                    if result_str in myresult_list:
                        mycursor.execute(f"UPDATE guide_info SET duplicate_queries = CONCAT('重复') WHERE id={id}")
                        print('重复')
                        mydb.commit()
                    else:
                        mycursor.execute(f"UPDATE guide_info SET duplicate_queries = CONCAT(guide_name, guide_cert_no, guide_id_card) WHERE id={id}")
                        mydb.commit()
                        #print('不重复')

                # mycursor.execute(f"UPDATE guide_info SET duplicate_queries = CONCAT(guide_name, guide_cert_no, guide_id_card) WHERE id={id}")
                    #mydb.commit()
            else:
                tip = data['tip']
                now = datetime.datetime.now()  # 获取当前时间和日期
                formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")  # 将时间格式化为"YYYY-MM-DD HH:MM:SS"格式
                update_query = f"UPDATE guide_info SET query_results='{tip}', query_time='{formatted_now}' WHERE id={id}"
                mycursor.execute(update_query)
                mydb.commit()
        # 更新last_processed_id和last_updated字段
        update_query = "UPDATE guide_status SET last_processed_id = %s, last_updated = %s"
        now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        update_params = (id, now)
        mycursor.execute(update_query, update_params)
        mydb.commit()

免费评分

参与人数 4吾爱币 +10 热心值 +4 收起 理由
redssky21327 + 1 + 1 我很赞同!
xyl52p + 1 + 1 谢谢@Thanks!
cfx0619 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| wangwei0511 发表于 2023-9-10 19:22
xyl52p 发表于 2023-9-8 19:44
请教楼主,你们景区针对不带团的导游有免票政策吗? 有电子导游证的真实导游。

没有哦,只能是带团的导游。但是嘛,如果你想来 可以私聊我。
任驰骋 发表于 2023-8-17 15:07
景区管理方的老板,会来白嫖软件吗。景区管理方的经理,主管,助理,更不会要免费的软件。景区管理的普通工作人员,只要人家拿出导游证,管他真的假的,收到钱又不是自己的,假如是真的被投诉还有风险。
greatzdl 发表于 2023-8-17 12:07
小强007 发表于 2023-8-17 12:30
干嘛用的?
ytfrdfiw 发表于 2023-8-17 13:51
和大家一样,没看明白作用。
额微粒波地 发表于 2023-8-17 14:04
sql执行都来了,这个数据库哪里有
sp0770 发表于 2023-8-17 14:19
算是杳黑导游的吗?实名认证
flylujun 发表于 2023-8-17 15:02
这是查导游是否是假的吗
 楼主| wangwei0511 发表于 2023-8-17 15:02
greatzdl 发表于 2023-8-17 12:07
导游信息的数据库是哪里的?

就是国家旅游局,去爬的。
 楼主| wangwei0511 发表于 2023-8-17 15:02
sp0770 发表于 2023-8-17 14:19
算是杳黑导游的吗?实名认证

算是吧,景区需要时真实的导游才能免票,所以需要比对是不是真实的导游。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 11:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表