Python中获取网站信息
什么是 URL?
统一资源定位符 (URL),并解释了他们是什么,以及如何被构建的。
和 Hypertext 以及 HTTP 一样,URL 是 Web 中的一个核心概念。它是浏览器用来检索 web 上公布的任何资源的机制。
URL 代表着是统一资源定位符(Uniform Resource Locator)。URL 无非就是一个给定的独特资源在 Web 上的地址。理论上说,每个有效的 URL 都指向一个唯一的资源。这个资源可以是一个 HTML 页面,一个 CSS 文档,一幅图像,等等。也有一些例外,
最常见的情况就是一个 URL 指向了不存在的或是被移动过的资源。由于通过 URL 呈现的资源和 URL 本身由 Web 服务器处理,因此 web 服务器的拥有者需要认真地维护资源以及与它关联的 URL。
下面是一些 URL 的示例:
https://developer.mozilla.org
https://developer.mozilla.org/zh-CN/docs/Learn/
https://developer.mozilla.org/zh-CN/search?q=URL
一个 URL 由不同的部分组成,其中一些是必须的,而另一些是可选的。让我们以下面这个 URL 为例看看其中最重要的部分:
协议
http 是协议。它表明了浏览器必须使用何种协议。它通常都是 HTTP 协议或是 HTTP 协议的安全版,即 HTTPS。Web 需要它们二者之一)
Authority
www.example.com 是域名。它表明正在请求哪个 Web 服务器。或者,可以直接使用IP address,但是因为它不太方便,所以它不经常在网络上使用。:80 是端口。它表示用于访问 Web 服务器上的资源的技术“门”。如果 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)来授予其资源的访问权限,则通常会被忽略。否则是强制性的。
资源路径
/path/to/myfile.html 是网络服务器上资源的路径。在 Web 的早期阶段,像这样的路径表示 Web 服务器上的物理文件位置。如今,它主要是由没有任何物理现实的 Web 服务器处理的抽象。
参数
?key1=value1&key2=value2 是提供给网络服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。
现在我们上网基本都是HTTP或者https
- https://zhuanlan.zhihu.com/p/158044137
- https://www.163.com/
HTTP 的全称是 HyperText Transfer Protocol (超文本传输协议)的缩写,
是一种建立在 TCP 上的无状态连接。HTTP 是互联网的基础协议,用于客户端与服务器之间的通信,它规定了客户端和服务器之间的通信格式,包括请求与响应的格式。
基本的工作流程是客户端发送一个 HTTP 请求,服务端收到请求开始处理,处理结束返回给客户端结果,客户端对结果进行处理并展示。
现在最流行的 HTTP 版本还是 1997 年发布的 HTTP/1.1。
浏览器上网打开网页的主要功能是访问http地址解析内容呈现网页
如何通过编程的方式获取网页内容
urllib模块
urllib.request
urllib.request 定义了一些打开 URL 的函数和类,
包含授权验证、重定向、浏览器 cookies等。
urllib.request 可以模拟浏览器的一个请求发起过程。
可以使用 urllib.request 的 urlopen 方法来打开一个 URL,语法格式如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
- url:url 地址。
- data:发送到服务器的其他数据对象,默认为 None。
- timeout:设置访问超时时间。
- cafile 和 capath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到。
- cadefault:已经被弃用。
- context:ssl.SSLContext类型,用来指定 SSL 设置。
实例如下:
实例
from urllib.request import urlopen
response= urlopen("https://www.163.com/")
print(response.read())
from urllib.request import urlopen
response = urlopen("https://www.163.com/")
print(response.read().decode('utf-8'))# 获取网页内容是一串文本
print(response.status) # 状态码,判 ,200表示网友正常访问
print(response.getheaders()) # 响应头
print(response.getheader('Server')) #得到特定的响应头
200
[('Date', 'Thu, 02 Nov 2023 03:21:08 GMT'), ('Content-Type', 'text/html; charset=utf-8'), ('Transfer-Encoding', 'chunked'), ('Connection', 'close'), ('Expires', 'Thu, 02 Nov 2023 03:22:28 GMT'), ('Server', 'AliyunOSS'), ('Cache-Control', 'no-cache,no-store,private'), ('Vary', 'Accept-Encoding'), ('X-Ser', 'BC140_dx-lt-yd-jiangsu-huaian-25-cache-3, BC210_dx-lt-yd-jiangsu-taizhou-4-cache-22, BC139_gd-hubei-wuhan-2-cache-4'), ('cdn-user-ip', '10.214.231.21'), ('cdn-ip', '113.57.83.139'), ('X-Cache-Remote', 'MISS'), ('cdn-source', 'baishan')]
AliyunOSS
read函数的内容如下:
实际上read函数返回的字符串是html文本, 网页设计的三个重要技术html,cssjs
仔细观察这个内容并不是百度首页的信息
- 原因是我们访问的是 http://www.163.com
- 实际上我们访问访问,最后会访问到https://www.163.com