如何使用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
相关产品推荐
相关产品推荐

