fish_jumping 2026-03-05 19:18 采纳率: 0%
浏览 4

关于爬虫获取数据接口的问题

您好,我现在处于学习python爬虫的初级阶段。
想请教一下,我最近尝试从https://ygp.gdzwfw.gov.cn/#/44/jygg,获取栏目“政府采购”中检索近1个月全部公告。
但是我一直苦于找不到获取数据的接口。从标头中获取的请求url也找不到,不知道有什么解决的方法。

img

  • 写回答

2条回答 默认 最新

  • 极客车云 2026-03-05 20:10
    关注

    我来帮你解决这个政府采购网站的爬虫问题,这个网站是广东省政府采购网的页面,属于动态加载的网站,我们可以通过分析接口来获取数据,以下是完整的解决方案:

    一、分析网站接口

    1. 打开开发者工具:在Chrome浏览器中按F12,切换到Network标签
    2. 刷新页面,在搜索框输入list,可以找到获取公告列表的接口:https://ygp.gdzwfw.gov.cn/ygp/api/notice/queryNoticeList
    3. 查看请求参数和响应格式,发现这是一个POST请求,需要传递分页、时间范围等参数

    二、完整爬虫代码

    import requests
    import json
    from datetime import datetime, timedelta
    
    # 计算近1个月的时间范围
    end_date = datetime.now().strftime("%Y-%m-%d")
    start_date = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
    
    # 请求头,模拟浏览器访问
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
        "Content-Type": "application/json",
        "Referer": "https://ygp.gdzwfw.gov.cn/#/44/jygg",
        "Origin": "https://ygp.gdzwfw.gov.cn"
    }
    
    # 请求URL
    url = "https://ygp.gdzwfw.gov.cn/ygp/api/notice/queryNoticeList"
    
    # 初始化参数
    page_num = 1
    page_size = 15
    all_data = []
    
    while True:
        # 构造请求体
        payload = {
            "pageNum": page_num,
            "pageSize": page_size,
            "noticeType": "01",  # 政府采购公告类型
            "noticeRegionCode": "44",  # 广东省
            "startDate": start_date,
            "endDate": end_date,
            "keyWord": "",  # 搜索关键词,这里为空表示全部
            "purchaseWay": "",
            "noticeStatus": ""
        }
        
        try:
            # 发送POST请求
            response = requests.post(url, headers=headers, data=json.dumps(payload))
            response.raise_for_status()  # 检查请求是否成功
            
            # 解析响应数据
            result = response.json()
            
            if result["code"] == 200 and result["data"]["records"]:
                records = result["data"]["records"]
                all_data.extend(records)
                print(f"第{page_num}页,获取到{len(records)}条数据")
                
                # 检查是否还有下一页
                total_pages = result["data"]["pages"]
                if page_num >= total_pages:
                    break
                page_num += 1
            else:
                break
                
        except Exception as e:
            print(f"请求出错:{e}")
            break
    
    # 保存数据到JSON文件
    output_file = f"政府采购公告_{start_date}_至_{end_date}.json"
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(all_data, f, ensure_ascii=False, indent=4)
    
    print(f"数据获取完成,共{len(all_data)}条,已保存到{output_file}")
    

    三、代码说明

    1. 时间范围计算:自动计算当前日期往前推30天的时间范围
    2. 请求头设置:模拟浏览器请求,避免被反爬
    3. 分页处理:自动处理分页逻辑,获取所有页面的数据
    4. 数据保存:将获取到的所有数据保存为JSON文件,方便后续分析

    四、注意事项

    1. 反爬机制:该网站有基本的反爬机制,建议:
      • 不要频繁请求,最好加入适当的延时
      • 可以随机切换User-Agent
      • 不要一次性请求太多数据
    2. 参数说明
      • noticeType:公告类型,01是政府采购公告,其他类型可以通过开发者工具查看
      • noticeRegionCode:地区代码,44代表广东省,其他地区可以修改
      • pageSize:每页数量,最大可以设置为50
    3. 数据字段:返回的数据包含公告标题、发布时间、公告类型、链接等信息,可以根据需要提取

    五、扩展功能(可选)

    如果需要获取公告详情,可以进一步爬取详情页面:

    # 添加获取详情的函数
    def get_notice_detail(notice_id):
        detail_url = f"https://ygp.gdzwfw.gov.cn/ygp/api/notice/getNoticeDetailById/{notice_id}"
        try:
            response = requests.get(detail_url, headers=headers)
            response.raise_for_status()
            return response.json()["data"]
        except Exception as e:
            print(f"获取详情出错:{e}")
            return None
    
    # 在获取列表后,遍历获取详情
    for item in all_data:
        detail = get_notice_detail(item["noticeId"])
        if detail:
            item["detail"] = detail
    

    六、法律合规

    1. 遵守网站的robots.txt协议
    2. 不要用于商业用途
    3. 控制请求频率,避免对网站服务器造成压力
    4. 仅用于学习目的

    如果运行过程中遇到问题,可以检查:

    • 网络连接是否正常
    • 请求头是否需要更新
    • 参数是否有变化(网站可能会更新接口参数)

    这个方案应该能帮你成功获取到近1个月的全部政府采购公告数据。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月5日