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αη
相关产品推荐
相关产品推荐

