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

Scrapy Splash如何处理onclick事件实现NMPA进口医疗器械站点数据爬取

你当前抓取失败的核心原因是列表项没有静态的href属性,跳转逻辑全部封装在onclick绑定的JS事件中,直接提取@href必然返回空结果,可按以下三种方案处理:


方案1:基于Splash模拟点击(适配现有技术栈,改动量最小)

你可以在SplashRequest中传入自定义Lua脚本,先等待列表渲染完成,再模拟点击每个列表项,获取详情页的内容或跳转后的链接,示例代码如下:

function main(splash, args)
  splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
  assert(splash:go(args.url))
  splash:wait(5)
  -- 提取所有列表项元素
  local items = splash:select_all("#content table tr a")
  local results = {}
  for i, item in ipairs(items) do
    item:mouse_click()
    splash:wait(3)
    -- 保存详情页html或跳转链接
    table.insert(results, {
      detail_html = splash:html(),
      detail_url = splash:url()
    })
    -- 返回列表页处理下一个条目
    splash:go_back()
    splash:wait(3)
  end
  -- 可在此处补充分页逻辑,点击下一页重复上述操作
  return {
    results = results
  }
end

修改后的爬虫代码:

import scrapy
from scrapy_splash import SplashRequest

# 填入上方Lua脚本
LUA_SCRIPT = """
function main(splash, args)
  splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
  assert(splash:go(args.url))
  splash:wait(5)
  local items = splash:select_all("#content table tr a")
  local results = {}
  for i, item in ipairs(items) do
    item:mouse_click()
    splash:wait(3)
    table.insert(results, {
      detail_html = splash:html(),
      detail_url = splash:url()
    })
    splash:go_back()
    splash:wait(3)
  end
  return {
    results = results
  }
end
"""

class NmpaSpider(scrapy.Spider):
    name = 'nmpa'
    http_user = 'hidden' # as am using Cloud Splash
    allowed_domains = ['nmpa.gov.cn']

    def start_requests(self):
        yield SplashRequest(
            'http://app1.nmpa.gov.cn/data_nmpa/face3/base.jsp?tableId=27&tableName=TABLE27&title=%E8%BF%9B%E5%8F%A3%E5%8C%BB%E7%96%97%E5%99%A8%E6%A2%B0%E4%BA%A7%E5%93%81%EF%BC%88%E6%B3%A8%E5%86%8C&bcId=152904442584853439006654836900',
            endpoint='execute',
            args={
                'lua_source': LUA_SCRIPT,
                'wait': 5
            }
        )

    def parse(self, response):
        result_list = response.data['results']
        for item in result_list:
            # 解析详情页内容即可
            print(item['detail_url'])

方案2:逆向JS逻辑构造详情链接(效率更高)

打开浏览器F12开发者工具,点击任意列表项查看绑定的onclick事件代码,这类站点的跳转逻辑通常是提取列表项的id参数,拼接固定前缀生成详情页地址。你只需要从列表元素中提取对应参数,直接拼接出详情页url发起请求即可,无需模拟点击。


方案3:直接抓取后端接口(效率最高)

在F12的网络面板中过滤XHR/fetch请求,点击列表项时查看实际发起的后端请求,提取请求地址、参数、请求头规则,直接构造请求拿结构化数据,不需要处理页面渲染逻辑,速度最快。


该站点属于政府公开数据站点,爬取时请控制请求频率,遵守robots协议,避免对站点正常运行造成影响。

内容的提问来源于stack exchange,提问作者αԋɱҽԃ αмєяιcαη

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:27:03