当我们在浏览器中输入网址并回车时,浏览器会向目标网站的服务器发送一个HTTP 请求,服务器接收到请求后,会返回对应的HTTP 响应(包含网页的 HTML 代码、图片、视频等资源),浏览器再将响应内容解析并展示出来。
Python 爬虫的核心,就是模拟浏览器发送 HTTP 请求,获取服务器返回的响应内容,再对内容进行解析和提取。HTTP 请求主要分为两种常用类型:
•GET 请求:用于获取网页内容,是最常用的请求类型,请求参数会拼接到网址后面(可见),比如搜索内容时的网址。
•POST 请求:用于向服务器提交数据(如登录、注册、提交表单),请求参数不会拼接到网址后面,安全性更高。
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. 爬取的数据仅用于学习和研究,禁止用于商业用途、恶意传播或侵犯他人隐私,否则可能承担相应的法律责任。