当前位置:首页>python>Python爬虫第一步,关于网页请求

Python爬虫第一步,关于网页请求

  • 2026-10-11 06:30:57
Python爬虫第一步,关于网页请求
  • 网页请求的核心原理

当我们在浏览器中输入网址并回车时,浏览器会向目标网站的服务器发送一个HTTP 请求,服务器接收到请求后,会返回对应的HTTP 响应(包含网页的 HTML 代码、图片、视频等资源),浏览器再将响应内容解析并展示出来。

Python 爬虫的核心,就是模拟浏览器发送 HTTP 请求,获取服务器返回的响应内容,再对内容进行解析和提取。HTTP 请求主要分为两种常用类型:

•GET 请求:用于获取网页内容,是最常用的请求类型,请求参数会拼接到网址后面(可见),比如搜索内容时的网址。

•POST 请求:用于向服务器提交数据(如登录、注册、提交表单),请求参数不会拼接到网址后面,安全性更高。

  • 使用 requests 库发送简单请求

requests库的核心优势是语法简洁,一行代码即可发送请求,下面从最简单的 GET 请求开始讲解。

3.1 发送 GET 请求(获取网页内容)

以获取百度首页内容为例,代码如下:

# 导入 requests 库import requests# 定义目标网址(百度首页)url = "https://www.baidu.com"# 发送 GET 请求,获取响应对象response = requests.get(url)# 打印响应对象的基本信息print("响应状态码:", response.status_code)  # 状态码,200表示请求成功print("响应编码:", response.encoding)        # 网页编码格式print("网页内容(前500个字符):", response.text[:500])  # 获取网页文本内容

代码说明:

•requests.get(url):发送 GET 请求,参数为目标网址,返回一个响应对象(response)。

•response.status_code:响应状态码,是判断请求是否成功的关键。200 表示请求成功,404 表示网页不存在,500 表示服务器内部错误,403 表示访问被拒绝(反爬机制)。

•response.encoding:网页的编码格式,常见的有 utf-8、gbk 等,编码错误会导致网页内容乱码。

•response.text:获取网页的文本内容(HTML 代码),适合处理文本类网页;如果是图片、视频等二进制资源,使用response.content。

  • 解决网页乱码问题

1/手动设置编码格式

pythonimport requestsurl = "https://www.baidu.com"response = requests.get(url)# 手动设置编码为 utf-8(百度首页编码为 utf-8)response.encoding = "utf-8"print("网页内容(前500个字符):", response.text[:500])

2/根据响应头自动识别编码(推荐)

requests提供了response.apparent_encoding属性,可自动识别网页实际编码,无需手动指定:

import requestsurl = "https://www.baidu.com"response = requests.get(url)# 自动识别编码并设置response.encoding = response.apparent_encodingprint("网页内容(前500个字符):", response.text[:500])

3/发送 POST 请求(提交数据)

POST 请求需要提交参数,参数通常以字典形式传入requests.post()的data参数中。以模拟登录某测试网站为例(实际网站需结合具体接口,此处为示例):

import requests# 目标登录接口(示例接口,非真实可用)url = "https://www.example.com/login"# 准备提交的参数(账号、密码)data = {    "username": "test_user",    "password": "test_pass"}# 发送 POST 请求,传入参数response = requests.post(url, data=data)# 处理响应response.encoding = response.apparent_encodingprint("登录响应内容:", response.text)

注意:实际网站的登录接口通常会有验证码、token 等验证机制,直接提交账号密码可能无法成功,后续进阶内容会讲解如何处理这类情况。

  • 请求参数的设置(进阶)

在实际爬虫中,仅发送基础请求往往无法获取到目标内容,需要设置请求参数,模拟浏览器行为,避免被网站识别为爬虫。常用参数包括请求头、请求参数、超时设置等。

设置请求头(Headers)

网站服务器会通过请求头(Headers)识别请求来源,若请求头中没有浏览器相关信息,可能会被拒绝访问。最常用的请求头参数是User-Agent(表示浏览器类型)。

获取 User-Agent 的方法:

打开浏览器(如 Chrome),按 F12 打开开发者工具,切换到“Network”选项卡,刷新网页,点击第一个请求,在右侧“Headers”中找到“User-Agent”,复制其值即可。

设置请求头的代码示例:

import requestsurl = "https://www.baidu.com"# 定义请求头,模拟 Chrome 浏览器headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"}# 发送请求时传入 headers 参数response = requests.get(url, headers=headers)response.encoding = response.apparent_encodingprint("网页内容(前500个字符):", response.text[:500])

设置 URL 参数(Params)

GET 请求的参数可以拼接到 URL 后面,也可以通过params参数传入,更简洁且不易出错。以百度搜索“Python 爬虫”为例:
import requests# 百度搜索基础 URLurl = "https://www.baidu.com/s"# 定义请求头headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"}# 定义搜索参数,wd 是百度搜索的关键词参数params = {    "wd": "Python 爬虫"}# 发送请求,传入 params 参数response = requests.get(url, headers=headers, params=params)response.encoding = response.apparent_encoding# 保存搜索结果到本地,方便查看withopen("baidu_search.html", "w", encoding="utf-8") as f:    f.write(response.text)    print("搜索结果已保存到 baidu_search.html 文件中")

运行代码后,会在当前目录生成一个baidu_search.html文件,打开即可看到百度搜索“Python 爬虫”的结果页面。

设置超时时间(Timeout)

若目标网站响应缓慢,爬虫会一直等待,影响效率。可以通过timeout参数设置超时时间(单位:秒),超过指定时间未响应则抛出异常。

import requestsurl = "https://www.baidu.com"headers = {    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"}# 设置超时时间为5秒,5秒内未响应则报错try:      response = requests.get(url, headers=headers, timeout=5)      response.encoding = response.apparent_encoding      print("请求成功,状态码:", response.status_code)except requests.exceptions.Timeout:     print("请求超时,请检查网络或目标网站")
  • 实战案例:获取网页标题并保存内容

结合以上知识点,完成一个简单实战:获取指定网页的标题,将网页内容保存到本地文件。以获取 CSDN 首页为例:
import requestsfrom bs4 import BeautifulSoup  # 用于解析网页,需提前安装:pip install bs4def get_webpage_info(url):      # 定义请求头      headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"    }          try:            # 发送 GET 请求,设置超时            response = requests.get(url, headers=headers, timeout=10)            # 处理编码            response.encoding = response.apparent_encoding                    # 判断请求是否成功            if response.status_code == 200:                    print(f"请求成功,状态码:{response.status_code}")                                # 解析网页,获取标题(使用 BeautifulSoup 简单解析)                    soup = BeautifulSoup(response.text, "html.parser")                    title = soup.title.string         if         soup.title         else "未获取到标题"                    print(f"网页标题:{title}")                                # 保存网页内容到本地                    filename = "csdn_home.html"                    with open(filename, "w", encoding="utf-8") as f:                            f.write(response.text)                    print(f"网页内容已保存到 {filename} 文件中")            else:                    print(f"请求失败,状态码:{response.status_code}")    except requests.exceptions.RequestException as e:            print(f"请求出错:{e}")# 调用函数,传入 CSDN 首页 URLif __name__ == "__main__":        target_url = "https://www.csdn.net"        get_webpage_info(target_url)

案例说明:

1. 本案例使用了BeautifulSoup库解析网页,用于提取网页标题,该库是爬虫常用的解析工具,后续会详细讲解。

2. 代码中加入了异常处理,覆盖了请求超时、请求失败等情况,让爬虫更健壮。

3. 运行代码前,需先安装bs4库:pip install bs4。

  • 常见问题与注意事项

常见问题及解决方法

•问题1:请求返回403 Forbidden:原因是网站识别出爬虫,解决方法是设置请求头(尤其是 User-Agent),模拟浏览器行为;也可以尝试更换 IP、添加延迟。

•问题2:网页内容乱码:解决方法是设置正确的编码格式,优先使用response.apparent_encoding自动识别。

•问题3:请求超时:检查网络连接,或适当延长超时时间;若目标网站禁止爬取,需停止请求。

爬虫伦理与法律注意事项

1. 爬取数据前,务必查看目标网站的robots.txt文件(如:https://www.baidu.com/robots.txt),该文件规定了网站允许爬取的内容,禁止爬取的内容需严格遵守。

2. 不要频繁发送请求,避免给目标网站服务器造成压力,建议在请求之间添加延迟(如:time.sleep(1),需导入 time 库)。

3. 爬取的数据仅用于学习和研究,禁止用于商业用途、恶意传播或侵犯他人隐私,否则可能承担相应的法律责任。

最新文章

随机文章