You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Scrapy爬取icab.es页面动态加载的姓名及号码数据?

Scrapy 爬取 icab.es 动态姓名及号码数据解决方案

一、Postman 发送请求报错修复方法

你遇到的Postman报错几乎都是请求参数或头信息不匹配导致的,按以下步骤排查即可:

  • 确认请求头完整:必须携带Referer、Origin、Content-Type: application/json三个核心头,值和你浏览器Network面板里看到的保持一致
  • 确认请求体格式正确:不要用form-data格式,选择raw+JSON格式,填入标准JSON结构的请求参数,示例参数如下:
{
    "page": 0,
    "size": 100,
    "filters": {
        "probono": false,
        "extraSearch": false
    }
}
  • 如果还报错,把浏览器请求里的User-Agent和Cookie也复制到Postman的头信息里即可正常返回数据。

二、Scrapy 完整实现代码

直接调用接口爬取的效率远高于渲染页面,以下是可直接运行的示例代码:

import scrapy
from scrapy.http import JsonRequest

class IcabLawyerSpider(scrapy.Spider):
    name = "icab_lawyer"
    allowed_domains = ["icab.es"]
    # 完全对齐浏览器的请求头,避免被拦截
    custom_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
        "Referer": "https://www.icab.es/es/servicios-a-la-ciudadania/necesito-un-abogado/buscador-de-profesionales/?extraSearch=false&probono=false",
        "Origin": "https://www.icab.es",
        "Content-Type": "application/json"
    }

    def start_requests(self):
        api_url = "https://www.icab.es/rest/icab-api/collegiates"
        # 调整page参数实现翻页,size最大可设为200减少请求次数
        post_params = {
            "page": 0,
            "size": 100,
            "filters": {
                "probono": False,
                "extraSearch": False
            }
        }
        yield JsonRequest(
            url=api_url,
            headers=self.custom_headers,
            data=post_params,
            callback=self.parse_lawyer_data
        )
    
    def parse_lawyer_data(self, response):
        res_json = response.json()
        # 遍历返回的列表提取所需字段
        for lawyer in res_json.get("content", []):
            yield {
                "姓名": lawyer.get("name", ""),
                "联系号码": lawyer.get("phone", "")
            }
        # 自动翻页逻辑,可按需开启
        # current_page = res_json.get("number", 0)
        # total_pages = res_json.get("totalPages", 0)
        # if current_page < total_pages -1:
        #     post_params = {
        #         "page": current_page + 1,
        #         "size": 100,
        #         "filters": {"probono": False, "extraSearch": False}
        #     }
        #     yield JsonRequest(
        #         url="https://www.icab.es/rest/icab-api/collegiates",
        #         headers=self.custom_headers,
        #         data=post_params,
        #         callback=self.parse_lawyer_data
        #     )

三、注意事项

  • 控制请求频率,建议每两次请求间隔1-2秒,避免触发站点的反爬机制导致IP被封禁
  • 如果出现403错误,更新User-Agent为当前你自己浏览器的UA即可恢复正常
  • 若需要爬取全部数据,开启代码里注释的翻页逻辑即可自动遍历所有页面

内容的提问来源于stack exchange,提问作者Cheri Joseph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:18:02