news 2026/9/16 18:53:54

ASP新闻爬虫系统:IIS环境下的DIV+CSS轻量聚合方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ASP新闻爬虫系统:IIS环境下的DIV+CSS轻量聚合方案

简介:这是一份面向ASP初学者与Web开发实践者的新闻数据采集实战项目,聚焦福建省本地新闻站点的自动化抓取与前端展示。资源采用经典ASP服务端技术栈,结合DIV+CSS实现语义化页面布局,覆盖HTTP请求、HTML解析、数据库交互(ADO)、动态页面生成等核心环节,适合巩固ASP基础并理解轻量级爬虫工程落地逻辑。压缩包共13个文件,含6个ASP后端脚本(负责请求调度与数据处理)、5个JS前端交互文件(增强页面响应能力)、1张JPG示例图及1份TXT说明文档,整体仅17KB,结构精简、即开即用。已有58人学习下载,读者可直接部署运行,获得完整可调式代码、福建新闻站点(news.onfj.com)的适配解析逻辑、错误处理机制及版本迭代痕迹(v2.1.1),是深入理解ASP时代Web爬虫设计思路的典型小而全案例。

1. 这不是“福建新闻网站”的镜像站,而是一套运行在 IIS 上的 ASP 动态页面爬虫系统——它用原生 DIV+CSS 渲染结果,不依赖 jQuery 或现代框架,专为 Windows Server + IIS 6/7/8/10/11 环境设计,适合政务信息员、本地媒体编辑、SEO 数据采集员快速部署轻量级新闻聚合页

你下载的福建ASP新闻爬虫(DIV+CSS) 2022 v2.1.1.zip并非一个 Python 脚本或 Node.js 服务,而是一个完整可运行的 ASP(Active Server Pages)Web 应用包。它的核心逻辑是:在服务器端(IIS)定时执行 VBScript 编写的 HTTP 请求与 HTML 解析,抓取福建省内主流新闻站点(如东南网、闽南网、福州新闻网等)首页或栏目页的<div>区块内容,再通过纯 CSS 控制排版,生成静态感强、加载极快、兼容 IE8+ 的聚合列表页。它不走 AJAX 异步加载,所有数据在.asp页面响应时已内联渲染完毕;也不用iframe嵌套外部页面——那是安全风险高、SEO 友好度低的过时做法。v2.1.1 版本关键升级在于:适配了 Win11 下 IIS 10 默认禁用 ASP 的新策略,修复了对含 UTF-8 BOM 头新闻源的乱码解析,并将 CSS 提取为独立/css/main.css文件,支持三行模式(标题+摘要+来源时间)的响应式断点控制。如果你正被“win11配置iis asp”卡住,或需要在老旧政务内网中跑一个零依赖、免 Node、免数据库的新闻看板,这个 ZIP 就是你要的最小可行交付物。

2. 搭建前提:在 Windows 11 上启用 IIS 并激活 ASP 经典模式,验证localhost/test.asp能输出 VBScript 结果

2.1 启用 IIS 与经典 ASP 支持(Win11 必做步骤)

Windows 11 默认关闭 IIS 且 ASP 功能被深度隐藏。必须手动开启三项组件:IIS 主服务ASP 经典支持Windows 身份验证(因部分福建新闻站需模拟登录)。打开“设置 → 应用 → 可选功能 → 添加功能”,勾选:

  • ✅ Internet Information Services
  • ✅ Internet Information Services → Web 管理工具 → IIS 管理控制台
  • ✅ Internet Information Services → WWW 服务 → 应用程序开发功能 →ASP(注意:不是 ASP.NET)
  • ✅ Internet Information Services → WWW 服务 → 安全 →Windows 身份验证

提示:若勾选后安装失败,打开 PowerShell(管理员),执行dism /online /enable-feature /featurename:IIS-ASP /all /norestart再重启。跳过此步直接解压运行会报错HTTP 错误 500.19 - Internal Server Error,错误代码0x8007000d,本质是 ASP 模块未注册。

2.2 配置 IIS 站点并设置 ASP 脚本映射

解压 ZIP 到C:\inetpub\wwwroot\fujian_news_crawler(路径不能含中文或空格)。打开 IIS 管理器 → “默认网站” → 右键“添加应用程序”,别名填news,物理路径选该文件夹。关键一步:右键新建的应用程序 → “处理程序映射” → “添加脚本映射”:

请求路径可执行文件名称
*.asp%windir%\system32\inetsrv\asp.dllASPClassic

注意:Win11 中asp.dll路径固定为system32\inetsrv\asp.dll,不可写成SysWOW64(64位系统下 32 位应用路径)。若映射错误,访问.asp页面会提示404.3 - Not Found,因为 IIS 不认识.asp扩展名。

2.3 验证 ASP 运行环境:创建 test.asp 输出服务器时间

fujian_news_crawler根目录新建test.asp,内容如下:

<%@ Language=VBScript %> <html> <head><title>ASP 测试页</title></head> <body> <h2>ASP 环境就绪</h2> <p>服务器时间:<%= Now() %></p> <p>脚本引擎:<%= ScriptEngine & "/" & ScriptEngineMajorVersion & "." & ScriptEngineMinorVersion %></p> </body> </html>

访问http://localhost/news/test.asp。若看到带时间的页面,说明 VBScript 引擎工作正常;若报错Microsoft VBScript runtime error '800a01ad',则是权限问题:右键文件夹 → “属性 → 安全 → 编辑 → 添加IIS_IUSRS用户并赋予“读取和执行”权限。

3. 解析爬虫核心逻辑:index.asp如何用 VBScript 抓取并结构化提取 DIV 内容

3.1index.asp的三层结构:配置区 → 数据获取区 → HTML 渲染区

打开index.asp,你会看到清晰的三段式布局。第一段是配置区(第 1–30 行),定义了news_sources数组,每个元素为站点名|URL|DIV选择器|编码四元组。例如东南网条目为:

news_sources(0) = "东南网|https://www.fjnet.com.cn/|div.news-list li|utf-8"

其中div.news-list li是关键——它不是 CSS 选择器语法,而是正则匹配模板:<div class="news-list">.*?<li>(.*?)</li>。ASP 无原生 DOM 解析器,故采用字符串正则提取,这是 v2.1.1 兼容老 IE 和低配服务器的设计取舍。

3.2GetHttpPage函数:绕过证书验证的 VBScript HTTP 请求

抓取函数GetHttpPage(url, encoding)使用MSXML2.ServerXMLHTTP.6.0对象发起请求。重点看其绕过 SSL 证书校验的写法(福建部分政府网站仍用自签名证书):

Set xmlHttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") xmlHttp.setOption 2, 13056 ' 忽略 SSL 证书错误(关键!) xmlHttp.Open "GET", url, False xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" xmlHttp.Send

参数13056SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS的值,强制忽略CERT_CN_INVALIDCERT_DATE_INVALID。若删掉此行,访问https://www.fznews.gov.cn/类站点会报错The server returned an invalid or unrecognized response

3.3ExtractByDiv函数:用正则精准捕获目标 DIV 区块内容

提取函数接收原始 HTML 字符串和div.news-list li这类描述,将其转为正则表达式:

' 将 "div.news-list li" → "<div[^>]*class=""news-list""[^>]*>[\s\S]*?<li>([\s\S]*?)</li>" pattern = "<" & tagParts(0) & "[^>]*class=""?" & tagParts(1) & """?[^>]*>[\s\S]*?<" & tagParts(2) & ">([\s\S]*?)</" & tagParts(2) & ">" Set regEx = New RegExp regEx.Pattern = pattern regEx.IgnoreCase = True regEx.Global = False Set matches = regEx.Execute(htmlContent)

注意:tagPartsSplit(selector, ".")Split(selector, " ")拆分而来。div.news-list li被拆为["div", "news-list", "li"],从而构造出可匹配嵌套结构的正则。这比简单InStr(html, "<div class=更鲁棒,能处理换行和属性顺序变化。

3.4ParseListItem函数:从<li>内容中提取标题、链接、摘要

每个<li>字符串传入ParseListItem(liHtml),用三重正则提取:

' 提取标题:匹配 <a href="...">标题文本</a> titlePattern = "<a[^>]*href=""([^""]*)""[^>]*>([^<]*)</a>" ' 提取摘要:匹配 <p>...</p> 或 <div class="summary">...</div> summaryPattern = "<(?:p|div)[^>]*class=""?summary""?[^>]*>([\s\S]*?)</(?:p|div)>" ' 提取时间:匹配 <span class="time">2022-03-15</span> timePattern = "<span[^>]*class=""?time""?[^>]*>([^<]*)</span>"

提示:若某新闻站不用<span class="time">,而用<i>2022年3月15日</i>,需修改timePattern"<i>([^<]*)</i>"并在index.aspnews_sources数组中为该站指定新规则,体现“按站定制”的灵活性。

4. CSS 渲染层详解:/css/main.css如何实现三行模式、鼠标悬停动画与响应式断点

4.1 三行模式的 CSS 结构:.news-item的 Flex 布局与文本截断

main.css第 42 行定义.news-itemdisplay: flex; flex-direction: column;,其子元素.title.summary.meta按序堆叠。关键技巧在.summary的省略处理:

.news-item .summary { font-size: 14px; line-height: 1.5; height: 3em; /* 严格限制为 3 行高度 */ overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; }

注意:-webkit-line-clamp在 IE10+ 和 Edge 12+ 有效,但 Firefox 需额外 JS 补丁。v2.1.1 为兼容性放弃 Firefox,专注政务内网常用 IE/Edge。若需全浏览器支持,可改用 JS 计算字符数截断,但会增加首屏延迟。

4.2 CSS 鼠标移入事件:.news-item:hover的涟漪光圈与背景渐变

悬停效果在第 78 行实现:

.news-item:hover { position: relative; z-index: 2; transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); background: linear-gradient(135deg, #f5f7fa 0%, #e4e7f1 100%); } .news-item:hover::before { content: ''; position: absolute; top: 50%; left: 50%; width: 300px; height: 300px; border-radius: 50%; background: radial-gradient(circle, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0) 70%); transform: translate(-50%, -50%) scale(0); transition: transform 0.6s ease-out; } .news-item:hover::before { transform: translate(-50%, -50%) scale(1); }

这就是“css 涟漪光圈扩散”效果:::before伪元素初始缩放为 0,悬停时放大至 1,配合transition实现扩散动画。radial-gradient创建透明圆心向外渐隐,避免生硬白边。

4.3 响应式断点:针对政务大屏与移动终端的双模式切换

媒体查询在第 115 行开始:

/* 默认:三行模式(桌面端) */ .news-item { padding: 12px 16px; } .news-item .title { font-size: 16px; } .news-item .summary { height: 3em; } /* 平板:两行模式 */ @media screen and (max-width: 768px) { .news-item { padding: 10px 12px; } .news-item .title { font-size: 15px; } .news-item .summary { height: 2em; } } /* 手机:单行模式 + 图标前置 */ @media screen and (max-width: 480px) { .news-item { padding: 8px 10px; display: flex; align-items: center; } .news-item .title { font-size: 14px; flex: 1; margin-left: 8px; } .news-item .summary { display: none; } /* 手机端隐藏摘要 */ .news-item::before { content: "📰"; font-size: 18px; margin-right: 6px; } }

此即“三行模式的css文件”的核心逻辑:用max-width断点逐级简化信息密度。手机端隐藏.summary并添加 Emoji 图标,既节省空间又提升识别度,符合政务移动端“快速扫读”场景。

5. 排查常见故障:当爬虫不更新、CSS 不生效或时间显示为 NaN 时,如何定位并修复

5.1 爬虫不更新?检查cache_timelast_update.txt时间戳

index.asp第 12 行定义cache_time = 1800(秒),即 30 分钟缓存。爬虫不会实时请求,而是先读取data/last_update.txt文件。若该文件存在且距今未超 1800 秒,直接读取data/cache.html显示。排查步骤:

  1. 删除data/last_update.txtdata/cache.html
  2. 访问http://localhost/news/index.asp?force=1(加force=1参数强制刷新)
  3. 查看data/last_update.txt是否生成新时间戳(格式:2022-03-15 14:22:35
  4. 若仍为空,检查data/目录权限:IIS_IUSRS必须有“写入”权限

注意:force=1是 v2.1.1 新增调试参数,仅限本地测试使用。生产环境请勿暴露此参数,防止被恶意刷爆目标站。

5.2 CSS 不生效?验证 MIME 类型与路径引用

若页面文字无样式、布局错乱,90% 是 CSS 文件未加载。检查三点:

检查项正确值错误表现
index.asp<link rel="stylesheet" href="/css/main.css">href路径必须以/开头(绝对路径)若写css/main.css,IIS 会尝试从虚拟目录根找,而非当前应用
IIS 中/css/目录的 MIME 类型.csstext/css若为application/octet-stream,浏览器拒绝解析
main.css文件编码UTF-8 无 BOM含 BOM 会导致 IE 下 CSS 规则失效,表现为@media查询不触发

验证方法:直接访问http://localhost/news/css/main.css,应看到纯 CSS 代码;若下载文件或报 404,说明路径或 MIME 配置错误。

5.3 时间显示为NaN?修正FormatDate函数中的正则捕获组

index.asp第 215 行FormatDate(str)函数将2022-03-152022年3月15日统一转为2022-03-15。若某站返回Mar 15, 2022,原函数会因正则不匹配返回NaN。修复方法:扩展正则,支持英文月份缩写:

' 在 FormatDate 函数开头添加: If str Like "Jan*####" Or str Like "Feb*####" Or str Like "Mar*####" Then ' 使用数组映射:arrMonth = Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") ' 提取 "Mar 15, 2022" 中的 Mar/15/2022,再查表转数字 monthName = Trim(Split(str, " ")(0)) day = CInt(Trim(Split(Split(str, " ")(1), ",")(0))) year = CInt(Split(str, " ")(2)) For i = 0 To 11 If LCase(monthName) = LCase(arrMonth(i)) Then monthNum = i + 1 Exit For End If Next FormatDate = year & "-" & Right("0" & monthNum, 2) & "-" & Right("0" & day, 2) Exit Function End If

此补丁使爬虫兼容英文新闻源,无需修改news_sources配置,体现 v2.1.1 的健壮性升级。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 18:53:38

浏览器指纹的物理本质与企业级对抗实战

1. 这不是“防关联”的问题&#xff0c;而是你根本没理解浏览器指纹的物理本质“求一个防关联检测工具&#xff0c;浏览器指纹在线检测”——这句话在技术社区里每天出现几十次&#xff0c;但90%的提问者连问题本身都没定义清楚。我做过三年反爬架构设计&#xff0c;也帮五家招…

作者头像 李华
网站建设 2026/9/16 18:52:48

Mac安装Homebrew报错128:homebrew-core克隆失败解决

mac 上第一次装 Homebrew&#xff0c;脚本跑到一半&#xff0c;终端里突然甩出来一行红字&#xff1a;Error: Failure while executing; git clone https://github.com/Homebrew/homebrew-core /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth1 exited with …

作者头像 李华
网站建设 2026/9/16 18:51:05

直线电机线圈:精密运动控制的核心技术解析

1. 直线电机线圈&#xff1a;精密直线运动的核心驱动力在工业自动化领域&#xff0c;直线电机正逐步取代传统的"旋转电机丝杆"传动方案&#xff0c;而马达直线电机线圈作为其核心部件&#xff0c;直接决定了整套系统的性能上限。我曾在多个精密设备项目中负责直线电机…

作者头像 李华