我爱it学习

 找回密码
 立即注册
搜索
查看: 37|回复: 0

[Python] 地图服务爬取

[复制链接]

8

主题

2

回帖

55

积分

注册会员

Rank: 2

积分
55
发表于 前天 15:28 | 显示全部楼层 |阅读模式
import os
import requests
import json
from urllib.parse import quote
import re

headers = {
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
    "Connection": "keep-alive",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Origin": "http://bzdt.ch.mnr.gov.cn",
    "Referer": "http://bzdt.ch.mnr.gov.cn/download.html?superclassName=%25E4%25B8%25AD%25E5%259B%25BD%25E5%2585%25A8%25E5%259B%25BE",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0",
    "X-Requested-With": "XMLHttpRequest"
}
cookies = {
    "JSESSIONID": "2A21F504B0E01929D61553D9090C88DC",
    "HWWAFSESTIME": "1748420564265",
    "HWWAFSESID": "4479e79724b249eda0"
}
url = "http://bzdt.ch.mnr.gov.cn/sbsm/supermap/searchPicture.do"

# 创建目录
os.makedirs("map", exist_ok=True)

# 清洗非法文件名字符
def sanitize_filename(name):
    return re.sub(r'[\\/*?:"<>|]', "", name)

for item in range(1, 14):
    data = {
        "seachText": "",
        "scale": "",
        "size": "",
        "pageNum": item,
        "orderSearch": "id",
        "superclass": "中国全图",
        "subclass": "",
        "smallclass": "",
        "border": "",
        "largeclass": "",
        "mapYear": "",
        "neighbouringCountry": "",
        "provinceColor": "",
        "illustration": ""
    }
    response = requests.post(url, headers=headers, cookies=cookies, data=data, verify=False)
    result_data = json.loads(response.text)
    results = result_data["message"]["result"]

    for item_data in results:
        name = item_data.get("name", "")
        size = item_data.get("size", "")
        content = item_data.get("content", "")
        id_ = item_data.get("id", "")

        # 构造文件名
        safe_name = sanitize_filename(name)
        safe_content = sanitize_filename(content)
        file_name = f"map/{safe_name}_{safe_content}.zip"

        # 拼接下载链接
        encoded_size = quote(size)
        down_url = f"https://bzdt-sbsm.obs.cn-north-4.myhuaweicloud.com/prototype/{encoded_size}/{id_}a.zip"

        print(f"正在下载: {down_url}")

        try:
            with requests.get(down_url, stream=True, timeout=30) as r:
                r.raise_for_status()  # 如果状态码不是 200,抛出异常
                with open(file_name, "wb") as f:
                    for chunk in r.iter_content(chunk_size=1024 * 1024):  # 流式下载
                        if chunk:
                            f.write(chunk)
            print(f"已保存至: {file_name}")
        except Exception as e:
            print(f"下载失败: {down_url}, 错误: {e}")
                  





免责声明:
1、论坛里的文章仅代表作者本人的观点,与本网站立场无关。出于遵守国家相关法规或促进论坛发展的前提,我们有权在不经作者准许的情况下删除其在【我爱it学习】所发表的文章。
2、论坛的所有文章、内容、信息、资料,都不保证其准确性、完整性、有效性、时效性。请依据情况自身做出判断。因阅读本站内容而被误导等其他因素所造成的损失责任自负。【我爱it学习】不承担任何责任。
3、坛友对自己的言论和行为负责,完全承担发表内容的责任,所持立场与【我爱it学习】论坛无关。论坛使用者因为任何行为而触犯中华人民共和国法律或相关法规的,一切后果自己负责,【我爱it学习】不承担任何责任。
4、坛友所发布的信息中涉及到具体的第三方个人(单位/公司)隐私、商业秘密等,侵犯其权益,对其构成不良影响的,由第三方向【我爱it学习】提交正式书面申请删除该信息后,【我爱it学习】有权将该信息予以直接删除处理。
5、如因系统维护或升级而需暂停服务时,将事先公告。若因线路及非本站点控制范围外的硬件故障或其它不可抗力而导致暂停服务,于暂停服务期间造成的一切不便与损失,【我爱it学习】不负任何责任。
6、凡以任何方式登陆本站或直接、间接使用【我爱it学习】论坛资料者,视为自愿接受【我爱it学习】论坛总规则的约束。本声明未涉及的问题参见国家有关法律法规,当本声明与国家法律法规冲突时,以国家法律法规为准。
7、【我爱it学习】所发布的一切文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理,Mail To: [email protected]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

侵权投诉|Archiver|小黑屋|我爱it学习

GMT+8, 2025-6-19 12:11

Powered by Discuz!

© 2001-2023 52itstudy.

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