【Python爬虫(5)】HTTP协议:Python爬虫的基石
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。
目录
- 一、HTTP 请求方法
- 1.1 GET
- 1.2 POST
- 1.3 PUT
- 1.4 DELETE
- 1.5 其他方法
- 二、HTTP 响应状态码详解
- 2.1 1xx 信息响应
- 2.2 2xx 成功响应
- 2.3 3xx 重定向
- 2.4 4xx 客户端错误
- 2.5 5xx 服务端错误
- 三、HTTP 头信息的作用与解析
- 3.1 通用头域
- 3.2 请求头域
- 3.3 响应头域
- 3.4 实体头域
- 四、总结
一、HTTP 请求方法
HTTP 协议定义了一系列的请求方法,用于客户端向服务器端请求资源或执行操作。这些请求方法决定了客户端与服务器之间交互的方式和目的。在爬虫开发中,正确理解和使用不同的请求方法至关重要,它直接影响到我们能否成功获取所需的数据。下面将详细介绍几种常见的 HTTP 请求方法。
1.1 GET
GET 方法是最常用的 HTTP 请求方法之一,主要用于从服务器获取资源。在使用 GET 请求时,参数会附加在 URL 的后面,以 “?” 分隔 URL 和参数,多个参数之间用 “&” 连接 。例如,在浏览器中访问https://www.baidu.com/s?wd=Python爬虫,其中 “wd=Python 爬虫” 就是 GET 请求的参数,“wd” 是参数名,“Python 爬虫” 是参数值,这个请求的目的是在百度上搜索 “Python 爬虫” 相关的内容。
GET 方法具有幂等性,即多次对同一资源进行相同的 GET 请求,其结果应该是一致的,不会对服务器资源产生额外的影响。同时,GET 方法是安全的,因为它只是获取数据,不应该对服务器上的资源进行修改。在爬虫中,当我们需要获取网页的 HTML 内容、图片、文本文件等静态资源时,通常会使用 GET 请求。比如,使用 Python 的requests库发送 GET 请求获取网页内容:
import requestsurl = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:print(response.text)
1.2 POST
POST 方法用于向服务器提交数据,通常用于表单提交、文件上传等场景。与 GET 方法不同,POST 方法的参数不会显示在 URL 中,而是放在请求体(Request Body)中 。这使得 POST 方法在传输敏感数据(如用户登录信息、信用卡号等)时更加安全,因为数据不会暴露在 URL 中。
在爬虫中,POST 请求常用于模拟用户登录操作。以登录一个网站为例,首先需要分析登录表单的字段和对应的 URL。假设登录表单有 “username” 和 “password” 两个字段,目标 URL 为https://www.example.com/login,使用requests库模拟登录的代码如下:
import requestsurl = 'https://www.example.com/login'
data = {'username': 'your_username','password': 'your_password'
}
response = requests.post(url, data=data)
if response.status_code == 200:print('登录成功')
else:print('登录失败')
1.3 PUT
PUT 方法用于更新服务器上的资源,它的语义是将请求体中的数据替换指定 URL 对应的资源 。如果该资源不存在,PUT 方法可以创建新的资源。在爬虫场景中,PUT 方法并不像 GET 和 POST 那样常用,但在一些需要修改服务器资源的情况下会发挥作用。例如,在爬虫过程中,如果我们需要更新某个用户在服务器上的个人资料,可以使用 PUT 请求。假设要更新用户的邮箱地址,请求的 URL 为https://www.example.com/user/123(其中 “123” 是用户 ID),请求体中包含新的邮箱地址:
import requestsurl = 'https://www.example.com/user/123'
data = {'email': 'new_email@example.com'
}
response = requests.put(url, data=data)
if response.status_code == 200:print('资料更新成功')
else:print('资料更新失败')
1.4 DELETE
DELETE 方法用于请求服务器删除指定的资源,其作用与 PUT 方法相反 。在爬虫中,DELETE 方法可用于清理一些不需要的数据,比如在测试环境中,删除爬虫生成的临时数据。假设要删除服务器上某个文件,其 URL 为https://www.example.com/files/abc.txt,使用requests库发送 DELETE 请求:
import requestsurl = 'https://www.example.com/files/abc.txt'
response = requests.delete(url)
if response.status_code == 200:print('文件删除成功')
else:print('文件删除失败')
1.5 其他方法
除了上述四种常见的请求方法外,HTTP 协议还定义了 OPTIONS、HEAD、TRACE、CONNECT 等方法,但在爬虫开发中这些方法使用相对较少。
- OPTIONS:用于获取服务器支持的 HTTP 请求方法。通过发送 OPTIONS 请求,客户端可以了解服务器对于特定资源支持哪些请求方法,以便在后续请求中做出合适的选择 。例如,发送 OPTIONS 请求到https://www.example.com,可以查看该网站支持的请求方法。
import requestsurl = 'https://www.example.com'
response = requests.options(url)
print(response.headers.get('Allow')) # 查看服务器支持的请求方法
- HEAD:类似于 GET 请求,但只返回响应的头部信息,不返回响应体。这在需要获取资源的元信息(如文件大小、修改时间等)时很有用,因为不需要传输整个响应内容,从而节省带宽和时间 。例如,要获取某个图片的大小和类型,可以使用 HEAD 请求。
import requestsurl = 'https://www.example.com/image.jpg'
response = requests.head(url)
print(response.headers.get('Content-Length')) # 文件大小
print(response.headers.get('Content-Type')) # 文件类型
- TRACE:用于回显服务器收到的请求,主要用于测试或诊断目的,帮助开发者排查请求在传输过程中是否被篡改等问题 。但由于 TRACE 方法可能存在安全风险(如跨站跟踪攻击),在实际应用中较少使用。
- CONNECT:主要用于代理服务器,将客户端的连接转换为隧道,使得客户端可以通过代理服务器与目标服务器建立 TCP 连接,常用于 HTTPS 代理等场景 ,在普通爬虫开发中较少涉及。
二、HTTP 响应状态码详解
在 HTTP 通信中,服务器在接收到客户端的请求后,会返回一个包含状态码的响应。这些状态码是服务器向客户端传达请求处理结果的重要方式,对于爬虫开发者来说,准确理解 HTTP 响应状态码的含义,是编写高效、稳定爬虫程序的关键。下面将详细介绍 HTTP 响应状态码的各个类别及其在爬虫中的应用。
2.1 1xx 信息响应
1xx 状态码属于信息性状态码,它表示服务器已经接收到请求,正在继续处理中。这类状态码在实际的爬虫场景中相对较少出现,但了解它们的含义有助于我们全面理解 HTTP 通信过程。
- 100 Continue:这个状态码表示服务器已经接收到请求头,并且客户端可以继续发送请求体。通常在客户端发送较大的请求体时,服务器先返回 100 Continue,告知客户端可以继续发送剩余的请求数据 。在爬虫中,如果我们使用分块传输的方式向服务器发送大量数据,可能会收到这个状态码。例如,当我们需要向服务器上传一个大文件时,服务器在接收到请求头,确认请求合法后,会返回 100 Continue,然后我们的爬虫程序就可以继续上传文件内容。
- 101 Switching Protocols:此状态码表示服务器同意根据客户端的请求切换协议。比如,客户端在请求中通过Upgrade头字段请求从 HTTP 协议升级到 WebSocket 协议,服务器如果同意切换,就会返回 101 Switching Protocols 状态码 。在一些需要实时数据交互的爬虫场景中,可能会涉及到协议切换,这时就可能会遇到这个状态码。
- 102 Processing:它表示服务器已经收到并正在处理请求,但尚未完成。这个状态码常用于 WebDAV(Web-based Distributed Authoring and Versioning)等扩展协议中,当处理复杂的请求(如涉及多个步骤的文件操作)时,服务器可能会返回 102 Processing,告知客户端请求正在处理中 。在爬虫涉及到复杂的文件操作请求时,可能会接收到这个状态码。
2.2 2xx 成功响应
2xx 状态码表示请求已成功被服务器处理,这是爬虫开发者最希望看到的一类状态码。在爬虫过程中,不同的 2xx 状态码有着不同的含义和用途。
- 200 OK:这是最常见的成功状态码,表示请求成功,服务器已经成功处理了请求,并返回了相应的响应内容。响应内容的具体形式取决于请求的方法和资源类型。例如,当我们使用 GET 请求获取一个网页的 HTML 内容时,如果返回状态码为 200 OK,就说明我们成功获取到了该网页的 HTML 数据 ,可以进一步对其进行解析和数据提取。
import requestsurl = 'https://www.example.com'
response = requests.get(url)
if response.status_code == 200:html_content = response.text# 在这里对html_content进行解析和数据提取
- 201 Created:表示请求成功,并且服务器创建了新的资源。这个状态码通常在使用 POST 或 PUT 请求创建新资源时返回。例如,我们使用爬虫模拟向一个博客平台发布新文章的操作,如果发布成功,服务器可能会返回 201 Created 状态码,同时在响应头中通过Location字段告知新创建文章的 URL 。
import requestsurl = 'https://www.example.com/blogs'
data = {'title': 'New Blog Post','content': 'This is a new blog post'
}
response = requests.post(url, data=data)
if response.status_code == 201:new_blog_url = response.headers.get('Location')print(f'新文章创建成功,URL: {new_blog_url}')
- 204 No Content:表示请求成功,但服务器没有返回任何内容。通常在服务器执行了请求,但不需要返回数据时使用,比如在使用 DELETE 请求删除资源成功后,服务器可能会返回 204 No Content 状态码 。在爬虫中,如果我们编写一个用于删除临时数据的爬虫脚本,当删除操作成功时,就可能收到这个状态码。
import requestsurl = 'https://www.example.com/temp_data/123'
response = requests.delete(url)
if response.status_code == 204:print('临时数据删除成功')
2.3 3xx 重定向
3xx 状态码表示客户端需要进行进一步的操作才能完成请求,通常用于资源的重定向。在爬虫中,处理重定向是一个重要的环节,因为它直接影响到我们能否获取到最终的目标资源。
- 301 Moved Permanently:表示请求的资源已被永久移动到新的位置,今后所有对该资源的请求都应该使用新的 URL 。服务器会在响应头中通过Location字段指定新的 URL。在爬虫中,当遇到 301 重定向时,我们的爬虫程序应该更新 URL,使用新的 URL 进行后续的请求。例如,我们的爬虫最初请求https://old.example.com,服务器返回 301 重定向,新的 URL 为https://new.example.com,那么我们的爬虫后续就应该使用https://new.example.com进行请求。
import requestsurl = 'https://old.example.com'
response = requests.get(url, allow_redirects=False)
if response.status_code == 301:new_url = response.headers.get('Location')response = requests.get(new_url)# 处理新URL的响应
- 302 Found:也称为临时重定向,表示请求的资源临时被移动到新的位置,客户端在本次请求中应该使用新的 URL,但后续请求仍可以使用原来的 URL 。同样,服务器会在响应头的Location字段中给出新的 URL。在爬虫中,处理 302 重定向的方式与 301 类似,但需要注意的是,由于是临时重定向,我们可能需要根据具体情况决定是否长期保存新的 URL。
- 304 Not Modified:这个状态码表示客户端所请求的资源未被修改,客户端可以继续使用缓存的版本。服务器返回 304 Not Modified 时,不会返回资源的内容,而是通过响应头中的一些字段(如Last-Modified、ETag等)来告知客户端资源未被修改 。在爬虫中,如果我们的爬虫程序实现了缓存机制,当接收到 304 Not Modified 状态码时,就可以直接使用缓存中的数据,而无需再次下载资源,从而节省带宽和时间。
2.4 4xx 客户端错误
4xx 状态码表示客户端发送的请求存在错误,服务器无法处理该请求。在爬虫开发中,遇到 4xx 状态码时,需要仔细分析错误原因,并采取相应的解决措施。
- 400 Bad Request:表示客户端发送的请求无效,服务器无法理解。这可能是由于请求语法错误、缺少必要的参数等原因导致的 。在爬虫中,如果我们构造的请求 URL 不正确,或者请求参数格式错误,就可能收到 400 Bad Request 状态码。例如,我们在使用 GET 请求时,参数格式错误,如https://www.example.com/s?wd=Python爬虫&age=twenty,其中 “age” 参数的值 “twenty” 不是合法的数字格式,就可能导致服务器返回 400 Bad Request。
- 401 Unauthorized:表示请求需要身份验证,客户端没有提供有效的身份凭证或者凭证无效 。在爬虫中,当我们尝试访问需要登录的页面或资源时,如果没有提供正确的用户名和密码(或其他身份验证信息),就会收到这个状态码。解决方法是在请求头中添加正确的身份验证信息,如使用requests库发送带有Authorization头字段的请求。
import requestsurl = 'https://www.example.com/protected'
headers = {'Authorization': 'Bearer your_token'
}
response = requests.get(url, headers=headers)
- 403 Forbidden:表示服务器理解客户端的请求,但拒绝执行该请求,通常是因为客户端没有足够的权限访问该资源 。在爬虫中,这可能是由于网站设置了反爬虫机制,识别出我们的爬虫程序,从而禁止访问。解决方法可以尝试更换 User - Agent(模拟不同的浏览器)、使用代理 IP、调整请求频率等。例如,我们可以在请求头中设置不同的 User - Agent:
import requestsurl = 'https://www.example.com'
headers = {'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)
- 404 Not Found:表示服务器无法找到客户端请求的资源,可能是因为 URL 拼写错误、资源已被删除或移动等原因 。在爬虫中,遇到 404 状态码时,首先要检查请求的 URL 是否正确,然后可以考虑使用重试机制,以防资源是暂时不可用。例如,我们可以使用try - except语句捕获 404 错误,并进行重试:
import requests
import timeurl = 'https://www.example.com/nonexistent'
max_retries = 3
retry_delay = 5for retry in range(max_retries):try:response = requests.get(url)if response.status_code == 200:breakelif response.status_code == 404:print(f'资源未找到,重试 {retry + 1}/{max_retries}')time.sleep(retry_delay)except Exception as e:print(f'请求出错: {e}')
2.5 5xx 服务端错误
5xx 状态码表示服务器在处理请求时发生了错误,无法完成客户端的请求。在爬虫中遇到 5xx 状态码时,通常不是客户端的问题,但我们可以采取一些措施来应对。
- 500 Internal Server Error:这是最常见的服务器错误状态码,表示服务器遇到了意外情况,无法完成请求。可能是由于服务器代码错误、数据库连接问题、资源不足等原因导致的 。在爬虫中,当遇到 500 Internal Server Error 时,我们可以尝试记录错误信息,然后进行重试。因为这种错误可能是暂时的,重试有可能成功。同时,我们可以查看服务器的日志文件(如果有访问权限),以获取更多关于错误的详细信息。
import requests
import logginglogging.basicConfig(level=logging.ERROR)
url = 'https://www.example.com'
max_retries = 3
retry_delay = 5for retry in range(max_retries):try:response = requests.get(url)if response.status_code == 200:breakelif response.status_code == 500:logging.error(f'服务器内部错误,重试 {retry + 1}/{max_retries}')time.sleep(retry_delay)except Exception as e:logging.error(f'请求出错: {e}')
- 502 Bad Gateway:表示服务器作为网关或代理,从上游服务器收到了无效的响应 。在爬虫中,这可能是由于代理服务器配置错误、上游服务器故障等原因导致的。如果我们的爬虫使用了代理服务器,首先要检查代理服务器的配置是否正确,然后可以尝试更换代理服务器。同时,也可以联系上游服务器的管理员,告知他们这个问题。
- 503 Service Unavailable:表示服务器暂时无法处理请求,通常是因为服务器过载、维护或者资源不足等原因 。在爬虫中,遇到 503 Service Unavailable 时,我们可以设置一个合理的重试间隔时间,然后进行重试。例如,每隔一段时间(如 10 分钟)重试一次,直到服务器恢复正常。同时,我们也可以在重试时记录重试次数和时间,以便后续分析。
三、HTTP 头信息的作用与解析
HTTP 头信息是 HTTP 协议中的重要组成部分,它包含了关于请求和响应的各种元数据,这些信息在客户端与服务器的交互过程中起着至关重要的作用。对于爬虫开发者来说,深入理解 HTTP 头信息的作用和解析方法,能够更好地掌握爬虫与服务器之间的通信机制,从而提高爬虫的效率和稳定性。HTTP 头信息主要分为通用头域、请求头域、响应头域和实体头域,下面将分别对它们进行详细介绍。
3.1 通用头域
通用头域包含的头信息既可以出现在请求中,也可以出现在响应中,用于提供一些通用的信息,如缓存控制、连接管理等。
- Cache-Control:用于指定请求和响应遵循的缓存机制 。在爬虫中,合理设置Cache-Control可以控制是否使用缓存以及如何使用缓存。例如,设置Cache-Control: no-cache,表示不使用缓存,每次都从服务器获取最新的数据,这在爬虫需要获取实时数据时非常有用;而设置Cache-Control: max-age=3600,表示缓存有效期为 3600 秒,在有效期内可以直接使用缓存数据,减少对服务器的请求次数,提高爬虫效率。
- Connection:用于控制客户端和服务器之间的连接方式 。常见的值有keep-alive和close。keep-alive表示保持连接,在一次请求响应完成后,连接不会立即关闭,而是可以继续用于后续的请求,这样可以减少建立新连接的开销,提高爬虫效率;close则表示请求完成后立即关闭连接。在爬虫中,如果需要频繁访问同一个服务器,建议使用keep-alive来保持连接。
- Date:表示消息发送的时间 。服务器在响应中会包含这个头信息,缓存机制会利用这个时间来评估响应的新鲜度。在爬虫中,虽然我们一般不会直接处理Date头信息,但了解它对于理解缓存机制和数据的时效性有帮助。
- Pragma:主要用于包含实现特定的指令,最常用的是Pragma: no-cache,其含义和Cache-Control: no-cache类似,用于指示不使用缓存 。在一些不支持Cache-Control的旧版本浏览器或服务器中,可能会使用Pragma来实现相同的缓存控制功能。在爬虫中,为了确保获取最新数据,也可以同时设置Pragma: no-cache和Cache-Control: no-cache。
- Transfer-Encoding:用于告知接收方消息体的编码方式 。常见的值是chunked,表示消息体采用分块传输编码。当服务器返回的数据量较大时,可能会采用分块传输的方式,将数据分成多个小块依次发送,这样可以避免一次性传输大量数据导致的问题。在爬虫中,当接收到Transfer-Encoding: chunked的响应时,需要正确处理分块数据,以获取完整的响应内容。
- Upgrade:用于指定客户端希望升级到的协议 。例如,客户端可以通过Upgrade头信息请求从 HTTP 协议升级到 WebSocket 协议,以实现实时通信。在爬虫中,一般不会涉及到协议升级的操作,但了解这个头信息有助于理解 HTTP 协议的扩展性。
- Via:用于列出从客户端到服务器之间经过的代理服务器 。每个代理服务器在转发请求时,会在Via头信息中添加自己的相关信息,这样可以追踪请求的路由路径。在爬虫使用代理服务器的情况下,Via头信息可以帮助我们了解请求经过了哪些代理,以便进行调试和问题排查。
3.2 请求头域
请求头域包含了客户端向服务器发送请求时的附加信息,这些信息可以帮助服务器更好地理解客户端的需求和状态。
- Accept:用于指定客户端能够接受的数据类型 。例如,Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, /;q=0.8表示客户端优先接受text/html类型的数据,其次是application/xhtml+xml和application/xml类型,q值表示权重,数值越高优先级越高,*/*表示接受其他任何类型的数据,但优先级较低。在爬虫中,根据需要获取的数据类型设置合适的Accept头信息,可以确保服务器返回我们期望的数据格式。
- Accept-Charset:用于指定客户端接受的字符集 。例如,Accept-Charset: utf-8, iso-8859-1;q=0.5表示客户端优先接受utf-8字符集,其次是iso-8859-1字符集。在爬虫中,如果爬取的网页涉及到不同的字符集,设置正确的Accept-Charset可以避免乱码问题。
- Accept-Encoding:用于指定客户端接受的编码格式 。常见的值有gzip、deflate等,这些编码格式可以对数据进行压缩,减少传输的数据量,提高传输效率。例如,Accept-Encoding: gzip, deflate表示客户端接受gzip和deflate编码格式的数据。在爬虫中,设置Accept-Encoding: gzip可以告诉服务器返回经过gzip压缩的数据,爬虫在接收到数据后再进行解压缩处理。
- Accept-Language:用于指定客户端接受的语言 。例如,Accept-Language: zh-CN, zh;q=0.8, en;q=0.7表示客户端优先接受简体中文(zh-CN),其次是其他中文(zh),然后是英文(en)。在爬虫中,如果需要获取特定语言版本的网页内容,可以设置相应的Accept-Language头信息。
- Authorization:用于身份验证,包含认证信息 。当访问需要登录的网站或资源时,客户端需要在Authorization头信息中提供有效的身份凭证,如用户名和密码的哈希值、令牌(Token)等。在爬虫中,模拟登录操作后,需要将获取到的认证信息添加到Authorization头信息中,以便后续访问受保护的资源。
- From:用于标识发出请求的用户的电子邮件地址 。虽然在实际的爬虫开发中,这个头信息使用较少,但在一些需要记录用户信息的场景下可能会用到。
- Host:用于指定请求资源的 Internet 主机和端口号 。它通常从请求的 URL 中提取出来,服务器根据Host头信息来确定客户端请求的是哪个网站或服务。在爬虫中,Host头信息是必不可少的,它确保请求能够正确地发送到目标服务器。
- Referer:用于表示请求发起的来源页面 。服务器可以根据Referer头信息来判断请求的合法性和来源路径。在爬虫中,设置合理的Referer头信息可以模拟正常的用户访问路径,避免被服务器识别为异常请求。例如,在爬取某个网站的图片时,Referer头信息可以设置为图片所在网页的 URL。
- User-Agent:用于标识请求的发起者,通常是浏览器的标识 。它包含了浏览器的类型、版本、操作系统等信息。例如,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36表示这是一个运行在 Windows 10 系统上的 Chrome 浏览器发出的请求。在爬虫中,设置合适的User-Agent非常重要,它可以帮助爬虫伪装成浏览器,避免被服务器识别为爬虫而拒绝访问。我们可以从网上收集各种常见的User-Agent字符串,并在爬虫中随机选择使用,以增加爬虫的隐蔽性。
3.3 响应头域
响应头域包含了服务器向客户端返回响应时的附加信息,这些信息可以帮助客户端了解服务器的状态和响应内容的相关信息。
- Server:用于标识服务器的软件信息 。例如,Server: Apache/2.4.41 (Ubuntu)表示服务器使用的是 Apache 2.4.41 版本,运行在 Ubuntu 操作系统上。在爬虫中,了解服务器的类型和版本信息,对于分析服务器的特性和可能存在的漏洞有一定的帮助。
- Content-Type:用于指定响应体的内容类型 。例如,Content-Type: text/html; charset=utf-8表示响应体是 HTML 格式,字符集为utf-8;Content-Type: application/json表示响应体是 JSON 格式的数据。在爬虫中,根据Content-Type头信息可以确定如何解析响应体内容,选择合适的解析方法和工具。
- Content-Length:用于表示响应体的长度(以字节为单位) 。客户端可以根据这个头信息来判断是否已经完整地接收了响应体内容。在爬虫中,当使用一些需要读取固定长度数据的方法时,Content-Length头信息就非常重要,它可以确保爬虫准确地读取到所有的响应数据。
- Content-Encoding:用于指定响应体的编码格式 。如果服务器对响应体进行了压缩(如gzip压缩),就会在Content-Encoding头信息中告知客户端。在爬虫中,当接收到带有Content-Encoding头信息的响应时,需要根据指定的编码格式对响应体进行解压缩处理,才能获取原始的数据。
- Content-Language:用于指定响应体所使用的语言 。例如,Content-Language: zh-CN表示响应体是中文简体。在爬虫中,如果需要根据语言来处理响应内容,可以参考Content-Language头信息。
- Set-Cookie:用于在客户端设置 Cookie 。服务器通过Set-Cookie头信息将 Cookie 发送给客户端,客户端在后续的请求中会将这些 Cookie 发送回服务器,用于维持会话状态或传递用户信息。在爬虫中,当爬取需要登录或有会话机制的网站时,需要处理Set-Cookie头信息,保存并在后续请求中正确传递 Cookie,以确保爬虫能够正常访问受保护的资源。
3.4 实体头域
实体头域用于描述请求或响应中实体主体的相关信息,如数据类型、长度、编码等。它既可以出现在请求中,也可以出现在响应中。在爬虫处理数据时,实体头域起着关键作用。
- Content-Type:在实体头域中,Content-Type同样用于确定数据的类型,如 HTML、JSON、XML、图片等不同格式 。爬虫根据这个信息来选择合适的解析方式。例如,当爬取的是一个 JSON 格式的 API 响应时,爬虫可以使用 Python 的json模块来解析数据;如果是 HTML 页面,则可以使用BeautifulSoup等库进行解析。
- Content-Length:它明确了实体主体的长度,爬虫可以利用这个信息来判断是否已经完整地接收了所有数据 。特别是在处理大文件下载时,通过对比已接收数据的长度和Content-Length的值,爬虫能够确保不会遗漏任何数据。
- Content-Encoding:指定了实体主体的编码方式,常见的如gzip、deflate等 。爬虫在接收到数据后,需要根据这个编码信息对数据进行解压缩,以获取原始数据。例如,如果响应头中Content-Encoding的值为gzip,爬虫就需要使用相应的解压缩库(如zlib库)对数据进行解压缩处理。
- Content-Language:说明了实体主体所使用的语言,这对于需要处理多语言数据的爬虫很重要 。爬虫可以根据这个信息对不同语言的数据进行分类处理,或者根据用户的语言偏好提供相应的数据。
- Last-Modified:表示实体的最后修改时间 。爬虫可以利用这个信息来判断数据是否发生了变化,从而决定是否需要重新获取数据。例如,在定期爬取某个网站的数据时,通过比较上次爬取时记录的Last-Modified时间和本次响应中的Last-Modified时间,爬虫可以确定数据是否有更新,只有在数据更新时才进行重新爬取,这样可以节省资源和时间。
- ETag:是实体的唯一标识符,类似于版本号 。服务器通过生成 ETag 来标识资源的特定版本。爬虫在后续请求中可以将之前获取的 ETag 发送给服务器,服务器根据 ETag 判断资源是否发生变化。如果资源未变化,服务器可以返回 304 Not Modified 状态码,爬虫就可以直接使用本地缓存的数据,而无需再次下载整个实体,提高了爬虫的效率。
四、总结
HTTP 协议作为 Python 爬虫与服务器之间交互的桥梁,在爬虫开发中占据着举足轻重的地位。通过对 HTTP 请求方法的熟练运用,我们能够根据不同的业务需求,准确地向服务器发送请求,获取或操作所需的数据。GET 方法适用于简单的数据获取,POST 方法则在数据提交和登录等场景中发挥关键作用,PUT 和 DELETE 方法用于资源的更新和删除,其他方法也各自有着特定的应用场景。
HTTP 响应状态码是服务器与我们沟通请求处理结果的重要方式。从 1xx 信息响应到 5xx 服务端错误,每一个状态码都蕴含着丰富的信息。通过对这些状态码的深入理解,我们能够在爬虫开发过程中,及时准确地判断请求的执行情况。当遇到 2xx 成功响应时,我们可以顺利地对获取到的数据进行处理;而当面对 4xx 客户端错误或 5xx 服务端错误时,我们能够根据具体的错误状态码,快速定位问题所在,并采取相应的解决措施,如调整请求参数、更换代理 IP、等待服务器恢复等,从而保证爬虫的稳定性和可靠性。
HTTP 头信息则为我们提供了关于请求和响应的详细元数据。通用头域控制着缓存和连接等通用行为,请求头域让我们能够在请求中携带各种必要的信息,如身份验证、数据类型偏好等,响应头域帮助我们了解服务器的状态和响应内容的特性,实体头域则专注于描述实体主体的相关信息。合理地设置和解析 HTTP 头信息,不仅能够使我们的爬虫更好地模拟真实用户的行为,避免被服务器识别为爬虫而进行限制或封禁,还能够帮助我们更高效地处理请求和响应,提高爬虫的数据获取能力和处理效率。
总之,深入理解 HTTP 协议的各个部分,包括请求方法、响应状态码和头信息,是成为一名优秀 Python 爬虫开发者的必备技能。只有掌握了这些知识,我们才能在爬虫开发的道路上,灵活应对各种复杂的网络环境和业务需求,开发出高效、稳定、可靠的爬虫程序,为数据采集和分析提供有力的支持。
相关文章:
【Python爬虫(5)】HTTP协议:Python爬虫的基石
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
机器学习数学基础:24.随机事件与概率
一、教程目标 本教程致力于帮助零基础或基础薄弱的学习者,全面掌握概率论与数理统计的基础公式,透彻理解核心概念,熟练学会应用解题技巧,最终能够轻松应对期末或考研考试。 二、适用人群 特别适合那些对概率论与数理统计知识了…...
Mongodb数据管理
Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…...
vue3响应式丢失解决办法(三)
vue3的响应式的理解,与普通对象的区别(一) vue3 分析总结响应式丢失问题原因(二) 经过前面2篇文章,知道了响应式为什么丢失了,但是还是碰到了丢失情况,并且通过之前的内容还不能解…...
Django中数据库迁移命令
在 Django 中,数据库迁移是确保数据库结构与 Django 模型定义保持一致的重要过程。以下是 Django 中常用的数据库迁移命令: 1. python manage.py makemigrations 功能:此命令用于根据 Django 项目的模型文件(models.pyÿ…...
LLM之循环神经网络(RNN)
在人工智能的领域中,神经网络是推动技术发展的核心力量。今天,让我们深入探讨循环神经网络(RNN) 一、神经网络基础 (1)什么是神经网络 神经网络,又称人工神经网络,其设计灵感源于人…...
TDengine 客户端连接工具 taos-Cli
简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互最简…...
Express 路由路径正则详解
在 Express 中,使用正则表达式可以定义更加灵活和复杂的路由。 1. 基本语法 在 Express 中,路由路径可以是一个字符串、字符串模式或者正则表达式。当使用正则表达式时,将其作为路由路径传入 app.METHOD() 方法(METHOD 可以是 g…...
快速设置 Docker 网络代理配置
Docker Client - 代理访问远程的 Docker Daemon 在 Client 端设置代理其实就是设置 Linux 系统的代理,从而让系统的命令行可以通过代理连接到外部的网络。一般只需要配置 HTTP_PROXY 与 HTTPS_PROXY 这两个即可。 临时生效: 在命令行中执行下面的命令&…...
JVM ②-双亲委派模型 || 垃圾回收GC
这里是Themberfue 在上节课对内存区域划分以及类加载的过程有了简单的了解后,我们再了解其他两个较为重要的机制,这些都是面试中常考的知识点,有必要的话建议背出来,当然不是死记硬背,而是要有理解的背~~~如果对 JVM …...
内容中台驱动企业数字化内容管理高效协同架构
内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...
人工智障的软件开发-自动流水线CI/CD篇-docker+jenkins部署之道
指令接收:「需要自动构建系统」 系统检测:目标开发一个软件已完成代码仓库-轻盈的gitea,开始添加自动流水线 启动应急冷却协议:准备承受Java系应用的资源冲击 核心组件锁定:构建老将军Jenkins(虽然年迈但依…...
数字人技术之LatentSync Win11本地部署
#LatentSync技术原理 字节跳动开源的基于音频条件潜在扩散模型的端到端唇同步框架,基于潜在扩散模型,以音频条件潜在扩散模型为基础,利用 Stable Diffusion 强大能力,直接建模复杂的音频与视觉之间的关系,实现高质量的唇形同步. 从而制作虚拟…...
Llama3.0论文学习笔记: The Llama 3 Herd of Models
1. 写在前面 今天分享Llama3.0的论文,2024.7月来自Meta的Llama团队,2025年1月DeepSeek R1出现之后,其风头显然已经盖住了Llama3,这时候整理Llama3感觉有点赶不上潮流了,但是我还是想整理下Llama3.0,原因是…...
C#学习之数据转换
目录 一、创作说明 二、数据类型之间的转换 1.数据类型之间的转换表格 2.代码示例 三、进制之间的转换 1.进制之间的转换表格 2.代码示例 四、ASCII 编码和字符之间的转换 1.ASCII 编码和字符之间的转换表格 2.代码示例 五、总结 一、创作说明 C#大多数时候都是和各…...
POI 和 EasyExcel
前言 将表格信息导出为Excel表格(导出数)将Excel表格信息录入到数据库(导入数据) 操作Excel目前比较流行的就是 Apache POI 和阿里巴巴的 EasyExcel Apache POI Apache POI 官网:https://poi.apache.org/ HSSF&am…...
分布式光纤传感:为生活编织“感知密网”
分布式光纤测温技术虽以工业场景为核心,但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术(DTS)作为一种先进的线型温度监测手段,近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…...
Web后端 - Maven管理工具
一 Maven简单介绍 Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 Maven的作用 二 Maven 安装配置 依赖配置 依赖传递 依赖范围 生命周期 注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都…...
聊一聊vue如何实现角色权限的控制的
大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…...
Java中使用EasyExcel
Java中使用EasyExcel 文章目录 Java中使用EasyExcel一:EasyExcel介绍1.1、核心函数导入数据导出数据 1.2、项目实际应用导入数据导出数据 1.3、相关注解ExcelProperty作用示例 二:EasyExcel使用2.1、导入功能2.2、导出功能 三:EasyExcel完整代…...
LLM:GPT 系列
阅读原文: LLM:Qwen 系列 GPT(Generative Pre-trained Transformer)是生成式预训练语言模型,基于 Transformer 架构,专注于通过自回归的方式生成自然语言文本,即给定一个输入序列 x { x 1 , …...
【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1
1,参考社区链接,首先降低gradio版本,降低到4以下,但是也不能降太低,也不能太高,要适中,推荐版本3.39.0 pip install gradio3.39.0 2,下载正确的httpx版本 参考社区链接࿰…...
Linux:深入了解进程信号(上)
目录 1. 什么是信号 1.1 引入 1.2 概念 1.3 特性 1.4 信号的三个方面 2. 信号的产生 2.1 键盘按键产生 2.2 signal捕捉信号函数 2.3 发送信号原理 2.4 硬件中断 2.5 指令和函数接口 2.5.1 kill指令 2.5.2 kill函数 2.5.3 raise与abort函数 2.6 软件条件 2.7 异…...
Java小白入门基础知识(二)
1.标识符 概念: 在程序中给类,方法,变量取的名称叫做标识符 规范: 字母,数字,下划线,$符号 注意: 不能以数字开头,也不能是关键字,严格区分大小写(一般定义常量就是大写) 软性建议: 1)类名:每个单词首字母大写(大驼峰) 2)方法名:首字母小写,后面每个单词首字母大写(小驼…...
Servlet中,WebServlet注解的使用方法
案例:声明abc接口,在接口内部获取配置信息 WebServlet(urlPatterns"/abc",loadOnStartup6,initParams {WebInitParam(name"username", value"mmm", description"this is username"),WebInitParam(name"a…...
重新出发的LLM本地部署——DeepSeek加持下的Ollama+OpenWebUI快速部署
DeepSeek 这真的是太惊艳了,发布出来的模型这么能打,在线的版本使用起来也是丝滑连招,感觉效果比起之前一直用智谱 chatglm4 更好用,想着本地化部署一下。 本来以为,会和之前在开发测试 transformers 的模型和代码一样…...
【Python爬虫(1)】专栏开篇:夯实Python基础
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
低代码组态软件-BY组态
引言 在工业4.0与智能制造浪潮的推动下,组态软件作为工业自动化的核心工具,正逐步从传统单机模式向Web化、智能化方向演进。BY组态作为一款基于Web的嵌入式组态插件工具,凭借其低代码、高灵活性和跨平台特性,成为工业物联网&#…...
【计算机网络】数据链路层数据帧(Frame)格式
在计算机网络中,数据帧(Frame) 是数据链路层的协议数据单元(PDU),用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议(如以太网、PPP、HDLC 等)。以下是常见数据帧格式的…...
[特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用
C语言中对文件打开关闭操作 前言方法一:标准输入输出库(stdio.h)—— 高级文件操作的利器打开文件💡 关闭文件:fclose示例代码📝 个人见解 方法一:系统调用(fcntl.h 和 unistd.h&…...
如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传
目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录(例如rpc)保存为一个Git仓库并上传到远程仓库,您可以遵循以下步骤: 1. 初始…...
应用分层、三层架构和MVC架构
前言 在前面中,我们已经学习了Spring MVC 的一些基础操作,那么后面就用一些简单的案例来巩固一下。 在开始学习做案例之前,我们先来了解一下在软件开发中常见的设计模式和架构。 应用分层 含义 应用分层是一种软件开发设计思想࿰…...
前端实现防抖功能的详细解读
在前端开发中,防抖(Debounce) 是一种优化技术,用于限制某个函数在短时间内被频繁调用的次数。它的核心思想是:在一定时间内,无论触发多少次事件,只执行最后一次操作。防抖通常用于处理用户输入、…...
VUE3环境搭建
最近准备用Vue编写一点前端页面,我在前端一直是个小白,之前用的Vue2写了几个页面,现在已经是VUE3了,重新安装下环境开始。 1.npm安装 Vue需要用npm安装,npm是nodejs的package manager,这里我们安装下node…...
1-16 tortoiseGit分支与Git操作
1-1 创建分支 什么时候需要开分支? - 隔离线上版本和开发版本 - 大功能开发,不想影响到其他人,自己独立开个分支去开发 SVN经典目录结构: - trunk-------------------------开发中的文件 - bran…...
【VB语言】EXCEL中VB宏的应用
【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示:以下是本篇文章正文内容,下面案例可供参考 一、EXCEL-VB 1.实验过…...
前端优化可以从哪些方面下手及优化方案
前端优化是提升网页性能、提升用户体验和降低服务器负担的重要手段。可以从多个角度入手,以下是一些常见的优化方向和方案: 1. 性能优化 减少请求数量:尽量减少页面加载时发起的 HTTP 请求,例如使用合并文件(CSS 和 …...
类和对象(5)——抽象类和接口
目录 1. 抽象类 1.1 抽象类的概念 1.2 抽象类语法:abstract关键字 1.3 抽象类的特性 1.4 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口语法:interface关键字 2.3 接口的实现:implements关键字 2.4 接口的特性 2.5 实现多个接口 …...
海康摄像头IPV6模式,手动,自动,路由公告
海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议(IP)的第六版,用于替代IPv4,提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接: 手动:用户可…...
LabVIEW与USB设备开发
开发一台USB设备并使用LabVIEW进行上位机开发,涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输,帮助用户顺利完成项目开发。下面是一个详细的说明&…...
BY组态:工业自动化的未来,触手可及
在工业4.0的浪潮下,智能化、数字化已成为制造业发展的核心驱动力。作为工业自动化领域的重要工具,组态软件在实现设备监控、数据采集、流程控制等方面发挥着不可替代的作用。然而,传统的组态软件往往存在开发周期长、学习成本高、灵活性不足等…...
深入理解Python多进程编程 multiprocessing
深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程,从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行,极大地提高了处理效率,特别是在…...
使用DeepSeek建立一个智能聊天机器人0.12
为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...
基于VLC的Unity视频播放器(三)
关于UMP插件 UMP插件不更新了,我测试在Ubuntu24.04上编辑器和运行时都无法正常播放,在替换lib之后编辑器可以播放,但打包后不行……很奇怪 继续更新了一下UnityVLC 添加了对Linux的支持,勉强都可以播放了…… Win截图 Ubuntu2…...
每日一题——把数字翻译成字符串
把数字翻译成字符串 题目描述示例示例1示例2 题解动态规划代码实现复杂度分析 总结 题目描述 有一种将字母编码成数字的方式:‘a’->1, ‘b’->2, … , ‘z’->26。 现在给一串数字,返回有多少种可能的译码结果。 数据范围:字符串…...
基于状态观测器和物联网基础设施的智能电网高速孤岛检测
论文标题 中文标题: 基于状态观测器和物联网基础设施的智能电网高速孤岛检测 英文标题: High-Speed Islanding Detection in Smart Grids Using a State Observer and IoT Infrastructure 作者信息 Shahid Karim<sup>1,2, *</sup>, Prajo…...
FPGA的星辰大海
编者按 时下风头正盛的DeepSeek,正值喜好宏大叙事的米国大统领二次上岗就业,OpenAI、软银、甲骨文等宣布投资高达5000亿美元“星际之门”之际,对比尤为强烈。 某种程度上,,是低成本创新理念的直接落地。 包括来自开源社区的诸多赞誉是,并非体现技术有多“超越”,而是…...
【Black Mesa】黑山起源用服务器开服多人联机教程
1、登录服务器(百度莱卡云游戏面板) 进入控制面板后会出现正在安装的界面,安装大约10分钟(如长时间处于安装中请联系我们的客服人员) 2、修改端口 看到一下图片的界面时说明服务器已经安装完成,服务器需要…...
【学习笔记】深度学习网络-深度模型中的优化
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中…...
java八股文之Redis
1.Rdis常见的使用场景 缓存分布式锁(redision,setnx)计数器保存token消息队列延迟队列 2.说明一下缓存雪崩,缓存穿透和缓存击穿以及解决方式 1.缓存雪崩 定义: 缓存雪崩指的是当大量的缓存数据同时失效,…...