Skip to content

ASP动态网页

更新: 2025/2/24 字数: 0 字 时长: 0 分钟

网页类型

静态网页

**前面我们所爬取的网页都是使用 HTML 超文本标记语言开发、设计的后缀为 .htm.html 的静态网页。它可以包含文本、图像、声音、客户端脚本和 ActiveX 控件及 JAVA 小程序等,但不能自行处理数据,没有后台数据库且不含程序和不可交互,因此静态网页更新起来相对比较麻烦,适用于一般更新较少的展示型网站。**但不要误解成静态网页只能展示静态内容,它也可以展示各种动态的效果,如 GIF 格式的动画、Flash 动画、滚动字幕等。这类网页也是网站建设的基础,早期的网站一般都是由静态网页制作的。

动态网页

有静态网页自然就有动态网页,即后缀为 ASP(Active Server Pages)的动态服务器页面,这类网页能自行接收、处理数据,并给客户端回复数据,主要用于创建和运行动态的交互式Web服务器应用程序。

类型区别

  1. 更新方式:.html 静态页面不具备连接数据库功能,每次更新就是更改整个页面或通过 Ajax 请求更新部分页面;.asp 动态网页可以连接数据库,更新网站内容只需要在后台增删内容就可以了。
  2. 文件后缀:.html.htm 均是静态网页文件后缀名,唯一的区别就是文件后缀的长度,它们实际上代表相同的类型,即 HTML(Hypertext Markup Language)文件;.asp.aspx 均是动态网页文件后缀名,其中 .aspx 编写效率更高,安全性也更高。
  3. 代码兼容:.html 的文件改成 .asp 的后缀没有任何影响,因为 asp 动态语言允许插入 html 代码,反过来完全不行。

20130805201524390

网页请求

**ASP 是动态网页,在一个网站中从一个动态网页访问到另一个动态网页时,需要保持控件的状态,即保持更新控件的 __ViewState 参数、__EventValidation 参数,来达到正常访问的目的。**具体访问流程如下:

  • 先 GET 请求动态页面的网址(一般是网站的首页或者网站板块的第一页):

20200408233257

  • 在网页代码中获取 __EventValidation 参数的 value 值、__ViewState 参数的 value 值:

20200408233954

  • 带上获取的两个 value 值,再 POST 请求下一个动态页面网址:

20200408234950

20200408235258

  • 重复上面的步骤,即可不断向后翻页,直到访问所有页面。

网页爬虫

python
import re
import requests

# 请求头
headers = {'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'}
# 地址
url = '...asp'
# 获取第一页响应
response1 = requests.get(url=url, headers=headers)
# 除去空格
Match = re.sub(r'\s*', '', response1.text)
# 获取网页代码中ViewState的value值
ViewState = re.findall(r'(?<=<inputtype="hidden"name="__VIEWSTATE"id="__VIEWSTATE"value=").*?(?=")|(?<=__VIEWSTATE\|).*?(?=\|)|(?<=<inputtype="hidden"name="__VIEWSTATE"value=").*?(?=")', Match)[0]
# 获取网页代码中EventValidation的value值
EventValidation = re.findall(r'(?<=<inputtype="hidden"name="__EVENTVALIDATION"id="__EVENTVALIDATION"value=").*?(?=")|(?<=__EVENTVALIDATION\|).*?(?=\|)', Match)[0]
# 构造表单
data = {
    '...':'...',
    '__VIEWSTATE':ViewState,
    '__EVENTVALIDATION':EventValidation
}
# post请求发送表单进行验证
response2 = requests.post(url=url, headers=headers, data=data)
# 输出下一页的内容
print(response2.text)